home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
8bitfiles.net/archives
/
archives.tar
/
archives
/
compuserve-file-archive
/
05 Programming
/
KERNEL.SRC
< prev
next >
Wrap
Text File
|
2019-04-13
|
88KB
|
6,055 lines
;===================================================================================
; VIC-20 KERNEL ROM Disassembly
; (c) 1995-1997 Richard A. Cini, Jr. All Rights Reserved.
;
; Release History:
; ================
; 1995/03/01 0.10 Scanned document
; {...many intervening steps...a slow, iterative process}
; 1997/03/21 0.99 First compiled completely with minor errors
; 1997/03/24 1.01 Completed fix-up. Code now compiles with all things in the right
; places.
;
;===================================================================================
;Compile with RAM variables only
#include "ramvars.inc"
.ORG $E000
.db $0F
.db $DC ;Carry-over from BASIC ROM @$C000 JSR DC0F
LDA FC1EXP
CMP #$88
BCC ELOOP2 ;E00B
ELOOP1
JSR MLDVEX
ELOOP2
JSR INT
LDA CHARAC
CLC
ADC #$81
BEQ ELOOP1 ;E008
SEC
SBC #$01
PHA
LDX #$05
ELOOP3
LDA FC2EXP,X
LDY FC1EXP,X
STA FC1EXP,X
STY FC2EXP,X
DEX
BPL ELOOP3 ;$E01B
LDA JMPER+2
STA FC1ROU
JSR FSUB+3 ;$D853
JSR NEGOP
LDA #$EA ;FIXUP1 ;#$C4
LDY #$EA ;FIXUP1+1 ;#$DF table of some constants
JSR POLYIN
LDA #$00
STA ARISGN
PLA
JSR MULDIV+2 ;$DAB9
RTS
;====================================================================
; POLYX - Function Series Evaluation
;
POLYX
STA CSBFLN
STY CSBFLN+1
JSR MOV2F+3 ;$DBCA
LDA #$57
JSR FMULT
JSR POLYX1
LDA #$57
LDY #$00
JMP FMULT
POLYIN
STA CSBFLN
STY CSBFLN+1
POLYX1
JSR MOV2F
LDA (CSBFLN),Y
STA SEVALP
LDY CSBFLN
INY
TYA
BNE POLYSK1
INC CSBFLN+1
POLYSK1
STA CSBFLN
LDY CSBFLN+1
POLYLP
JSR FMULT
LDA CSBFLN
LDY CSBFLN+1
CLC
ADC #$05
BCC POLYSK2
INY
POLYSK2
STA CSBFLN
STY CSBFLN+1
JSR FADD
LDA #$5C
LDY #$00
DEC SEVALP
BNE POLYLP
RTS
;====================================================================
; RMULC - Constant Manipulation: RND Data
;
RMULC
.db $98, $35, $44, $7A, $00
RMULC1
.db $68, $28, $B1, $46, $00
;====================================================================
; RND - Perform RND function
;
RND
JSR SIGN
BMI RNDCAL
BNE RANDDT
JSR IOBASE
STX UTLPTR
STY UTLPTR+1
LDY #$04
LDA (UTLPTR),Y
STA FC1M1
INY
LDA (UTLPTR),Y
STA FC1M3
LDY #$08
LDA (UTLPTR),Y
STA FC1M2
INY
LDA (UTLPTR),Y
STA FC1M4
JMP RNDEXIT
RANDDT
LDA #$8B
LDY #$00
JSR MOVFM
LDA #$EA ;FIXUP1+2 ;#$8A randomize data LSB
LDY #$EA ;FIXUP1+3 #$E0 ;randomize data MSB
JSR FMULT ;multiply
LDA #$EA ;FIXUP1+4 ;#$8F
LDY #$EA ;FIXUP1+5 ;#$E0
JSR FADD ;ADD at E0BF
RNDCAL
LDX FC1M4
LDA FC1M1
STA FC1M4
STX FC1M1
LDX FC1M2
LDA FC1M3
STA FC1M2
STX FC1M3
RNDEXIT
LDA #$00
STA FC1SGN
LDA FC1EXP
STA FC1ROU
LDA #$80
STA FC1EXP
JSR FADD+112 ;$D8D7
LDX #$8B
LDY #$00
RNEXIT
JMP MOV2F+13 ;$DBD4
;====================================================================
; BIOERR - Handle I/O Error in BASIC
;
BIOERR
CMP #$F0
BNE BERSK
STY MEMSIZ+1
STX MEMSIZ
JMP CLEAR+5 ;$C663
BERSK
TAX
BNE BERREX
LDX #$1E
BERREX
JMP ERROR
;====================================================================
; BCHOUT - Output character
;
BCHOUT
JSR CHROUT
BCS BIOERR
RTS
;====================================================================
; BCHIN - Input a character
;
BCHIN
JSR CHRIN
BCS BIOERR
RTS
;====================================================================
; BCKOUT - Setup for output
;
BCKOUT
JSR CHKOUT
BCS BIOERR
RTS
;====================================================================
; BCKIN - Setup for input
;
BCKIN
JSR CHKIN
BCS BIOERR
RTS
;====================================================================
; BGETIN - Get one character
;
BGETIN
JSR GETIN
BCS BIOERR
RTS
;====================================================================
; SYS - Perform SYS
;
SYS
JSR FRMNUM ;confirm result
JSR GETADR ;convert FAC1 to integer (line) number
LDA #$EA ;FIXUP1+7 #$E1
PHA
LDA #$EA ;FIXUP1+6 #$43
PHA ;push address $E143 (breakpoint)
LDA R6502P
PHA ;save processor flags
LDA R6502A
LDX R6502X
LDY R6502Y
PLP ;restore flags
JMP (INTRVL) ;jump to routine
PHP ;on return, restore regs
STA R6502A
STX R6502X
STY R6502Y
PLA
STA R6502P
RTS
;====================================================================
; SAVET - Perform SAVE
;
SAVET
JSR SLPARA
LDX VARTAB
LDY VARTAB+1
LDA #$2B
JSR SAVE
BCS BIOERR
RTS
;====================================================================
; VERFYT - Perform Verify/Load
;
VERFYT
LDA #$01 ;1=verify
.db $2C ;results in BIT $00A9 skip
VERFYL
LDA #$00 ;0=load
STA VERCK
JSR SLPARA
LDA VERCK
LDX TXTTAB
LDY TXTTAB+1
JSR LOAD
BCS CLSEXT
LDA VERCK
BEQ VERLD
LDX #$1C
JSR READST
AND #$10
BEQ SKPRDY
JMP ERROR
SKPRDY
LDA TXTPTR
CMP #$02
BEQ VERIFX
LDA #$64
LDY #$C3
JMP STROUT ;string at $C364
VERIFX
RTS
VERLD
JSR READST
AND #$BF
BEQ VERSK1
LDX #$1D
JMP ERROR
VERSK1
LDA TXTPTR+1
CMP #$02
BNE VERSK2
STX VARTAB
STY VARTAB+1
LDA #$76
LDY #$C3
JSR STROUT ;string at $C376
JMP $C52A
VERSK2
JSR STXPT
JMP BASSLN
;====================================================================
; OPENT - Perform OPEN
;
OPENT
JSR OCPARA
JSR OPEN
BCS CLSEXT
RTS
;====================================================================
; CLOSET - Perform CLOSE
;
CLOSET
JSR OCPARA
LDA FORPNT
JSR CLOSE
BCC VERIFX
CLSEXT
JMP BIOERR
;====================================================================
; SLPARA - Get LOAD/SAVE parameters
;
SLPARA
LDA #$00
JSR SETNAM
LDX #$01
LDY #$00
JSR SETLFS
JSR DEFLT
JSR OCPSK2
JSR DEFLT
JSR COMBYT
LDY #$00
STX FORPNT
JSR SETLFS
JSR DEFLT
JSR COMBYT
TXA
TAY
LDX FORPNT
JMP SETLFS
;====================================================================
; COMBYT - Get next one-byte parameter
;
COMBYT
JSR COMMA
JMP GETBYT+3
;====================================================================
; DEFLT - Check default parameters
;
DEFLT
JSR CHRGOT
BNE DEFLEX
PLA
PLA
DEFLEX
RTS
;====================================================================
; COMMA - Check for comma
;
COMMA
JSR CHKCOM
JSR CHRGOT
BNE DEFLEX
JMP SNERR
;====================================================================
; OCPARA - Get OPEN/CLOSE parameters
;
OCPARA
LDA #$00
JSR SETNAM
JSR COMMA+3
JSR GETBYT+3
STX FORPNT
TXA
LDX #$01
LDY #$00
JSR SETLFS
JSR DEFLT
JSR COMBYT
STX FORPNT+1
LDY #$00
LDA FORPNT
CPX #$03
BCC OCPSK1
DEY
OCPSK1
JSR SETLFS
JSR DEFLT
JSR COMBYT
TXA
TAY
LDX FORPNT+1
LDA FORPNT
JSR SETLFS
JSR DEFLT
JSR COMMA
OCPSK2
JSR FRMEVL
JSR FRESTR
LDX UTLPTR
LDY UTLPTR+1
JMP SETNAM
;====================================================================
; COS - Perform COS function
;
COS
LDA #$EA ;FIXUP1+12;#$DD
LDY #$EA ;FIXUP1+13;#$E2 PI2 table
JSR FADD
;====================================================================
; SIN - Perform SIN function
;
SIN
JSR MOVAF
LDA #$EA ;FIXUP1+14 ;#$E2
LDY #$EA ;FIXUP1+15 ;#$E2 PI*2 table
LDX FC2SGN
JSR FDIV
JSR MOVAF
JSR INT
LDA #$00
STA ARISGN
JSR $D853
LDA #$EA ;FIXUP1+16;#$E7
LDY #$EA ;FIXUP1+17;#$E2
JSR FSUB ;const 1/4
LDA FC1SGN
PHA
BPL SINCON1
JSR FADDH
LDA FC1SGN
BMI SINCON1A
LDA TANSGN
EOR #$FF
STA TANSGN
SINCON1
JSR NEGOP
SINCON1A
LDA #$EA ;FIXUP1+16;#$E7
LDY #$EA ;FIXUP1+17;#$E2
JSR FADD ;const 1/4
PLA
BPL SINCON2
JSR NEGOP
SINCON2
LDA #$EA ;FIXUP1+18; #$EC
LDY #$EA ;FIXUP1+19;#$E2 ;counter
JMP POLYX
;====================================================================
; TAN - Perform TAN function
;
TAN
JSR $DBCA
LDA #$00
STA TANSGN
JSR SIN
LDX #$4E
LDY #$00
JSR RNEXIT
LDA #$57
LDY #$00
JSR MOVFM
LDA #$00
STA FC1SGN
LDA TANSGN
JSR TAN2
LDA #$4E
LDY #$00
JMP FDIVT
TAN2
PHA
JMP SINCON1
;
;Data: Trigonometry Constants $E2DD-E30A
PI2 ;PI/2
.db $81, $49, $0F, $DA, $A2
PI22 ;PI*2
.db $83, $49, $0F, $DA, $A2
PI14 ;1/4
.db $7F, $00, $00, $00, $00
RNCTR ;counter
.db $05
TRIG14 ;-14.3813907
.db $84, $E6, $1A, $2D, $1B
TRIG42 ;42.0077971
.db $86, $28, $07, $FB, $F8
TRIG76 ;-76.7041703
.db $87, $99, $68, $89, $01
TRIG81 ;81.6052237
.db $87, $23, $35, $DF, $E1
TRIG41 ;-41.3417021
.db $86, $A5, $5D, $E7, $28
TRIG6 ;6.28318531
.db $83, $49, $0F, $DA, $A2
;====================================================================
; ATN - Perform ATN function
;
ATN
LDA FC1SGN
PHA
BPL ATNSK1
JSR NEGOP
ATNSK1
LDA FC1EXP
PHA
CMP #$81
BCC ATNSK2
LDA #$BC
LDY #$D9 ;FONE - table of floating point constants
JSR FDIVT
ATNSK2
LDA #$EA ;FIXUP1+22;#$3B
LDY #$EA ;FIXUP1+23;$$E3 ATNCON - table of ATN constants
JSR POLYX
PLA
CMP #$81
BCC ATNSK3
LDA #$EA ;FIXUP1+12;#$DD
LDY #$EA ;FIXUP1+13;#$E2 ;const PI/2
JSR FSUB
ATNSK3
PLA
BPL ATNEXT
JMP NEGOP
ATNEXT
RTS
;
; ATN Constants $E33B-E377
;
ATNCON
.db $0B, $76, $B3, $83, $BD, $D3, $79, $1E
.db $F4, $A6, $F5, $7B, $83, $FC, $B0, $10
.db $7C, $0C, $1F, $67, $CA, $7C, $DE, $53
.db $CB, $C1, $7D, $14, $64, $70, $4C, $7D
.db $B7, $EA, $51, $7A, $7D, $63, $30, $88
.db $7E, $7E, $92, $44, $99, $3A, $7E, $4C
.db $CC, $91, $C7, $7F, $AA, $AA, $AA, $13
.db $81, $00, $00, $00, $00,
;====================================================================
; INIT - BASIC cold start
;
INIT
JSR INITV
INITNV
JSR INITCZ
JSR INITMS
LDX #$FB
TXS
JMP READY ;jump to BASIC
;====================================================================
; INITAT - CHRGET for zero-page
;
INITAT
INC TXTPTR
BNE ININCR
INC TXTPTR+1
ININCR
LDA MOVLOOP-2
CMP #':' ;$3A
BCS INIEXT
CMP #' ' ;$20 {space}
BEQ INITAT
SEC
SBC #$30
SEC
SBC #$D0
INIEXT
RTS
;====================================================================
; RNDSED - RND seed value
;
RNDSED
.db $80, $4F, $C7, $52, $58
;====================================================================
; INITCZ - Initialize BASIC RAM
;
INITCZ
LDA #$4C
STA JMPER
STA USRPOK
LDA #$EA ;FIXUP1+24;#$48
LDY #$EA ;FIXUP1+25;#$D2
STA USRVEC ;USER vector to $D248
STY USRVEC+1
LDA #$EA ;FIXUP1+26;#$91
LDY #$EA ;FIXUP1+27;#$D3
STA ADRAY2
STY ADRAY2+1 ;$D391
LDA #$EA ;FIXUP1+28;#$AA
LDY #$EA ;FIXUP1+29;#$D1
STA ADRAY1
STY ADRAY1+1 ;$D1AA
LDX #$1C
CHGLOP
LDA INITAT,X ;copy CHRGET
STA CHRGET,X
DEX
BPL CHGLOP
LDA #$03
STA JMPER-1 ;$53
LDA #$00
STA FC1OVF
STA IOPMPT
STA LASTPT+1
LDX #$01
STX BUF-3 ;$01FD
STX BUF-4 ;$01FC
LDX #$19
STX TEMPPT
SEC
JSR MEMBOT
STX TXTTAB
STY TXTTAB+1
SEC
JSR MEMTOP
STX MEMSIZ
STY MEMSIZ+1
STX FRETOP
STY FRETOP+1
LDY #$00
TYA
STA (TXTTAB),Y
INC TXTTAB
BNE CZEXIT
INC TXTTAB+1
CZEXIT
RTS
;====================================================================
; INITMS - Print power-up message
;
INITMS
LDA TXTTAB
LDY TXTTAB+1
JSR REASON ; Check for memory overlap?
LDA #$EA ;FIXUP1+30;#$36 WORDS text
LDY #$EA ;FIXUP1+31;#$E4
JSR STROUT
LDA MEMSIZ
SEC
SBC TXTTAB
TAX
LDA MEMSIZ+1
SBC TXTTAB+1
JSR $DDCD ; External entry into INPRT
LDA #$EA ;FIXUP1+32;#$29 FREMES text
LDY #$EA ;FIXUP1+33;#$E4
JSR STROUT
JMP $C644 ; External entry into SCRTCH
FREMES
.db " BYTES FREE", $0D, $00
WORDS
.db $93, "**** CBM BASIC V2 ****", $0D, $00
;====================================================================
; BVTRS - Basic vector table
;
BVTRS
.dw ERROR+3 ;$C43A
.dw MAIN+3 ;$C483
.dw CRNCH+3 ;$C57C
.dw QPLOP+3 ;$C71A
.dw GONE+3 ;$C7E4
.dw EVAL+3 ;$CE86
;====================================================================
; INITV - Initialize vectors
;
INITV
LDX #$0B ;move 12 bytes
TVLOOP
LDA BVTRS,X ;load from BASIC vector table
STA ERRVPT,X ;save to $0300
DEX
BPL TVLOOP
RTS
;====================================================================
; BASSFT - BASIC warm start
;
BASSFT
JSR CLRCH
LDA #$00
STA IOPMPT
JSR $C67A ;External entry into CLEAR
CLI
JMP READY
.db $41
BASSLN
JSR LNKPRG
JMP $C677 ;external entry into CLEAR
;====================================================================
; FIXUP1 - Absolute location fixup area #1
;
FIXUP1 ;$E47C
.dw $DFC4 ;0 e47c
.dw RMULC ;2 7e
.dw RMULC1 ;4 80
.dw SYS+28 ;6 82
.dw $C364 ;8 84
.dw $C316 ;10 86
.dw PI2 ;12 88
.dw PI22 ;14 8a
.dw PI14 ;16 8c
.dw RNCTR ;18 8e
.dw $D9BC ;20 90
.dw ATNCON ;22 92
.dw $D248 ;24 94
.dw $D391 ;26 96
.dw $D1AA ;28 98
.dw WORDS ;30 9a
.dw FREMES ;32 9c
.dw PROCMORE ;34 9e
;ends at $ef9f
;====================================================================
; SOUT1 - Serial output 1 (inverted logic)
;
SOUT1
LDA D2PCR
AND #%11011111 ;$DF CB2
STA D2PCR
RTS
;====================================================================
; SOUT0- Serial output 0 (inverted logic)
;
SOUT0
LDA D2PCR
ORA #%00100000 ;$20
STA D2PCR
RTS
;====================================================================
; SDCLK - Get SERDATA/SCLK in
;
SDCLK
LDA D1ORAH
CMP D1ORAH
BNE SDCLK
LSR A
RTS
;====================================================================
; SSADR - Get SECADR patch for LOAD/VERIFY
;
SSADR
LDX SECADR
JMP SRCHMS
;====================================================================
; SLDPCH - Relocated patch for serial LOAD/VERIFY
;
SLDPCH
TXA
BNE SLDEXIT
LDA MEMUSS
STA EAL
LDA MEMUSS+1
STA EAL+1
SLDEXIT
JMP LOADMS
;====================================================================
; TPWPCH - Tape write patch for CLOSE
;
TPWPCH
JSR TPWRIT
BCC TPWCHEX
PLA
LDA #$00
TPWCHEX
JMP ICLSE2 ;External entry into ICLOSE
;====================================================================
; FIXUP2 - Absolute location fixup area #2
;
FIXUP2 ;$E4DA
.dw KNRLSV ;e4da FD6D
.dw KDECD1 ;dc
.dw $FFFF ;de
.dw $FFFF ;e0
.dw $FFFF ;e2
.dw $FFFF ;e4
.dw $FFFF ;e6
.dw $FFFF ;e8
.dw $FFFF ;ea
.dw $FFFF ;ec
.dw $FFFF ;ee
.dw $FFFF ;f0
.dw $FFFF ;f2
.dw $FFFF ;f4
.dw $FFFF ;f6
.dw $FFFF ;f8
.dw $FFFF ;fa
.dw $FFFF ;fc
.dw $FFFF ;fe
;ends at $e4ff
;====================================================================
; IIOBASE - Return I/O base address
;
IIOBASE
LDX #$10
LDY #$91
RTS
;====================================================================
; ISCREN - Return screen organization
;
ISCREN
LDX #$16
LDY #$17
RTS
;====================================================================
; IPLOT - Read/set cursor position
;
IPLOT
BCS READPL ;carry set to read
STX CURROW
STY CSRIDX
JSR SCNPTR
READPL
LDX CURROW
LDY CSRIDX
RTS
;====================================================================
; CINT1 - Initialize I/O
;
CINT1
JSR IODEF1
LDA HIPAGE
AND #%11111101 ;$FD
ASL A
ASL A
ORA #%10000000 ;$B0/80?
STA VRSTRT
LDA HIPAGE
AND #%00000010 ;$02
BEQ CINT1A ;$E536
LDA #%10000000 ;$B0
ORA VRCOLS
STA VRCOLS
CINT1A
LDA #$00
STA SHMODE
STA BLNON
LDA #$EA ;FIXUP1+34;#$DC
STA FCEVAL
LDA #$EA ;FIXUP1+35;#$EB
STA FCEVAL+1 ;FCEVAL=$EEDC???
LDA #$0A
STA KBMAXL
STA KRPTDL
LDA #$06
STA CLCODE
LDA #$04
STA KRPTSP
LDA #$0C
STA BLNCT
STA BLNSW
;
; Clear screen
;
CLRSCN
LDA HIPAGE
ORA #%10000000 ;$80
TAY
LDA #$00
TAX
CLRLP1
STY SLLTBL,X
CLC
ADC #$16
BCC CLRSC1
INY
CLRSC1
INX
CPX #$18
BNE CLRLP1
LDA #$FF
STA SLLTBL,X
LDX #$16
CLRLP2
JSR CLRLIN
DEX
BPL CLRLP2
;
; Home cursor
;
HOME
LDY #$00
STY CSRIDX
STY CURROW
;
; Set screen pointers
;
SCNPTR
LDX CURROW
LDA CSRIDX
SCNPLP
LDY SLLTBL,X
BMI SCNPT1
CLC
ADC #$16
STA CSRIDX
DEX
BPL SCNPLP
SCNPT1
LDA SLLTBL,X
AND #$03
ORA HIPAGE
STA LINPTR+1
LDA LBSCAD,X
STA LINPTR
LDA #$15
INX
SCNLP1
LDY SLLTBL,X
BMI SCNEXIT
CLC
ADC #$16
INX
BPL SCNLP1
SCNEXIT
STA LINLEN
RTS
;====================================================================
; PANIC - Set I/O defaults (unused entry point)
;
PANIC
JSR IODEF1
JMP HOME
;
; Real PANIC entry
;
IODEF1
LDA #$03
STA OUTDEV
LDA #$00
STA INDEV
;
; Initialize 6561 VIC
;
LDX #$10
V6561I
LDA VICSUP-1,X ;$ede3
STA $8FFF,X
DEX
BNE V6561I
RTS
;====================================================================
; LP2 - Get character from keyboard buffer
;
LP2
LDY KBUFFR
LDX #$00
LP2LOOP
LDA KBUFFR+1,X
STA KBUFFR,X
INX
CPX KEYCNT
BNE LP2LOOP
DEC KEYCNT
TYA
CLI
CLC
RTS
;====================================================================
; INKEY - Input from keyboard
;
INKEY
JSR OUTSCR
KEYLP1
LDA KEYCNT
STA BLNSW
STA SCRLFL
BEQ KEYLP1
SEI
LDA BLNON
BEQ INKEY1
LDA GDBLN
LDX CSRCLR
LDY #$00
STY BLNON
JSR PRNSCR
INKEY1
JSR LP2
CMP #$83
BNE INKEY2
LDX #$09
SEI
STX KEYCNT
KEYLP2
LDA RUNSHF-1,X
STA KBUFFR-1,X
DEX
BNE KEYLP2
BEQ KEYLP1
INKEY2
CMP #$0D
BNE INKEY
LDY LINLEN
STY INSRC
KEYLP3
LDA (LINPTR),Y
CMP #$20
BNE INKEY3
DEY
BNE KEYLP3
INKEY3
INY
STY EOLPTR
LDY #$00
STY SCRLFL
STY CSRIDX
STY CSRMOD
LDA ICRROW
BMI INSCR1
LDX CURROW
JSR CSRMIN+4 ;$E719
CPX ICRROW
BNE INSCR1 ;$E657
BNE INSCR1
LDA ICRCOL
STA CSRIDX
CMP EOLPTR
BCC INSCR1
BCS INSCR4A
;====================================================================
; INSCR - Input from screen/keyboard until <RET>
;
INSCR
TYA
PHA
TXA
PHA
LDA INSRC
BEQ KEYLP1
INSCR1
LDY CSRIDX
LDA (LINPTR),Y
.db $ea, $ea, $ea, $ea, $ea, $ea, $ea, $ea
.db $ea, $ea, $ea, $ea, $ea, $ea, $ea, $ea
.db $ea, $ea, $ea, $ea, $ea, $ea, $ea
STA LASTKY
AND #%00111111 ;$3F
ASL LASTKY
BIT LASTKY
BPL INSCR2
ORA #%10000000 ;$B0/80
INSCR2
BCC INSCR3
LDX CSRMOD
BNE INSCR4
INSCR3
BVS INSCR4
ORA #%01000000 ;$40
INSCR4
INC CSRIDX
JSR QUOTET
CPY EOLPTR
BNE INSCR7
INSCR4A
LDA #$00
STA INSRC
LDA #$0D
LDX INDEV
CPX #$03
BEQ INSCR5
LDX OUTDEV
CPX #$03 ;output to screen?
BEQ INSCR6
INSCR5
JSR OUTSCR
INSCR6
LDA #$0D
INSCR7
STA LASTKY
PLA
TAX
PLA
TAY
LDA LASTKY
CMP #$DE ;which key??
BNE INSCREX
LDA #$FF ;load return code
INSCREX
CLC
RTS
;====================================================================
; QUOTET - Quotes test
;
QUOTET
CMP #$22 ;quote
BNE QUOTEX
LDA CSRMOD
EOR #%00000001 ;$01
STA CSRMOD
LDA #$22
QUOTEX
RTS
;====================================================================
; CMD4 cmd- Setup screen print
;
CMD4
ORA #%01000000 ;$40
LDX RVS
BEQ CMD41 ;$e6cd
ORA #%10000000 ;$B0 or 80
CMD41
LDX INSRTO
BEQ CMD42 ;$e6d3
DEC INSRTO
CMD42
LDX CLCODE
JSR PRNSCR
JSR CSRPLS
CMD42A
PLA
TAY
LDA INSRTO
BEQ CMD4SK ;$E6E4
LSR CSRMOD
CMD4SK
PLA
TAX
PLA
CLC
CLI
RTS
;====================================================================
; CSLPLS - Advance cursor
;
CSRPLS
JSR CKLNPL
INC CSRIDX
LDA LINLEN
CMP CSRIDX
BCS CSREXIT ;$E72C
CMP #$57
BEQ CSRDEC ;$E723
LDA SCRLFL
BEQ CSRPSK ;$E701
JMP INSSLOP ;$E9F0
CSRPSK
LDX CURROW
CPX #$17
BCC CSRSK2 ;$E70E
JSR SCRLSC
DEC CURROW
LDX CURROW
CSRSK2
ASL SLLTBL,X
LSR SLLTBL,X
JMP G4
;====================================================================
; CSRMIN - Move cursor back
;
CSRMIN
ADC #$16 ;add 22d (screen line length)
STA LINLEN
CSRMLP
LDA SLLTBL,X
BMI CSRMIN1 ;$E720
DEX
BNE CSRMLP ;$E719
CSRMIN1
JMP LINSTR
CSRDEC
DEC CURROW
JSR NEWLIN
LDA #$00
STA CSRIDX
CSREXIT
RTS
;====================================================================
; CSRUP - Move cursor up
;
CSRUP
LDX CURROW
BNE CSRUP1 ;$E737
STX CSRIDX
PLA
PLA
BNE CMD42A ;$E6DC
CSRUP1
DEX
STX CURROW
JSR SCNPTR
LDY LINLEN
STY CSRIDX
RTS
;====================================================================
; OUTSCR - Output to screen
;
OUTSCR
PHA
STA LASTKY
TXA
PHA
TYA
PHA
LDA #$00
STA INSRC
LDY CSRIDX
LDA LASTKY
BPL NOSHCH ;$E756
JMP SHCHRS
;
; Output unshifted characters
;
NOSHCH
CMP #$0D
BNE NOTCR ;$E75D
JMP CR
NOTCR
CMP #$20 ;{space}
BCC CTRLCODE ;$E771
CMP #$60 ;last standard ASCII
BCC ALPHA ;$E769
AND #%11011111 ;$DF
BNE ALPHA1 ;$E76B
ALPHA
AND #%00111111 ;$3F
ALPHA1
JSR QUOTET
JMP CMD4+2 ;$E6C7
CTRLCODE
LDX INSRTO
BEQ NOINSERT ;$E778
JMP CMD41-2 ;$E6CB
NOINSERT
CMP #$14 ;{delete}
BNE NOTDEL ;$E7AA
TYA
BNE DEL ;$E785
JSR CSRUP ;$E72D
JMP NOSHCH1 ;$E79F
DEL
JSR CKLNMI ;$E8E8
DEY
STY CSRIDX
JSR BLINK
NOSHLP1
INY
LDA (LINPTR),Y
DEY
STA (LINPTR),Y
INY
LDA (COLRPT),Y
DEY
STA (COLRPT),Y
INY
CPY LINLEN
BNE NOSHLP1 ;$E78E
NOSHCH1
LDA #$20
STA (LINPTR),Y
LDA CLCODE
STA (COLRPT),Y
BPL NOTRT1A ;$E7F7
NOTDEL
LDX CSRMOD
BEQ NOTDEL1 ;$E7B1
JMP CMD41-2 ;$E6CB
NOTDEL1
CMP #$12 ;{RVS}
BNE NOTRVS ;$E7B7
STA RVS
NOTRVS
CMP #$13 ;{HOME}
BNE NOTHOME ;$E7BE
JSR HOME
NOTHOME
CMP #$1D ;{RIGHT}
BNE NOTRT ;$E7D9
INY ;right
JSR CKLNPL
STY CSRIDX
DEY
CPY LINLEN
BCC CSRRTEX ;$E7D6
DEC CURROW
JSR NEWLIN
LDY #$00
STY CSRIDX
CSRRTEX
JMP CMD42A ;$E6DC
NOTRT
CMP #$11 ;{DOWN}
BNE NOTDOWN ;$E7FA
CLC ;down
TYA
ADC #$16
TAY
INC CURROW
CMP LINLEN
BCC CSRRTEX-2 ;$E7D4
BEQ CSRRTEX-2 ;$E7D4
DEC CURROW
NOTRTLP
SBC #$16
BCC NOTRT1 ;$E7F4
STA CSRIDX
BNE NOTRTLP ;$E7EC
NOTRT1
JSR NEWLIN
NOTRT1A
JMP CMD42A
NOTDOWN
JSR STCLRC ;$E912
JMP GRTXTF ;$ED21
;
; Output shifted characters
;
SHCHRS
.db $ea, $ea, $ea, $ea, $ea, $ea, $ea, $ea
.db $ea, $ea, $ea, $ea, $ea, $ea, $ea, $ea
.db $ea, $ea, $ea, $ea, $ea
AND #%01111111 ;$7F
CMP #%01111111 ;$7F
BNE SRCH_S1 ;$E81D
LDA #$5E
SRCH_S1
.db $ea, $ea, $ea, $ea, $ea, $ea
CMP #$20 ;{space}
BCC SRCH_S2 ;$E82A
JMP CMD4 ;$E6C5
SRCH_S2
CMP #$0D ;{return}
BNE SRCH_S3 ;$E831
JMP CR
SRCH_S3
LDX CSRMOD
BNE SCHR2 ;$E874
CMP #$14 ;{text}
BNE SCHR1 ;$E870
LDY LINLEN
LDA (LINPTR),Y
CMP #$20
BNE SRCH_S4 ;$E845
CPY CSRIDX
BNE SRCH_S5 ;$E84C
SRCH_S4
CPY #$57
BEQ SCHR1-3 ;$E86D
JSR INSSPC ;$E9EE
SRCH_S5
LDY LINLEN
JSR BLINK
SHCHLOOP
DEY
LDA (LINPTR),Y
INY
STA (LINPTR),Y
DEY
LDA (COLRPT),Y
INY
STA (COLRPT),Y
DEY
CPY CSRIDX
BNE SHCHLOOP ;$E851
LDA #$20
STA (LINPTR),Y
LDA CLCODE
STA (COLRPT),Y
INC INSRTO
JMP CMD42A
SCHR1
LDX INSRTO
BEQ SRCH_S6 ;$E879
SCHR2
ORA #%01000000 ;$40
JMP CMD4+6 ;$E6CB
SRCH_S6
CMP #$11 ;{down}
BNE SCHR3 ;$E893
LDX CURROW
BEQ SHCHEXIT-3 ;$E8B8
DEC CURROW
LDA CSRIDX
SEC
SBC #$16
BCC SRCH_S7 ;$E88E
STA CSRIDX
BPL SHCHEXIT-3 ;$E8B8
SRCH_S7
JSR SCNPTR
BNE SHCHEXIT-3 ;$E8B8
SCHR3
CMP #$12 ;{RVS}
BNE SRCH_S8 ;$E89B
LDA #$00
STA RVS
SRCH_S8
CMP #$1D ;{right}
BNE SHCH4 ;$E8B1
TYA
BEQ SRCH_S9 ;$E8AB
JSR CKLNMI ;$E8E8
DEY
STY CSRIDX
JMP CMD42A
SRCH_S9
JSR CSRUP ;$E72D
JMP CMD42A
SHCH4
CMP #$13 ;{home}
BNE SHCHEXIT ;$E8BB
JSR CLRSCN ;$E55F
JMP CMD42A
SHCHEXIT
ORA #%10000000 ;$80
JSR STCLRC ;$E912
JMP G1 ;$ED30
;====================================================================
; NEWLIN - Goto next line
;
NEWLIN
LSR ICRROW
LDX CURROW
NWLNLP
INX
CPX #$17
BNE NEWLIN1 ;$E8CF
JSR SCRLSC
NEWLIN1
LDA SLLTBL,X
BPL NWLNLP ;$E8C7
STX CURROW
JMP SCNPTR
;====================================================================
; CR - Output <RET>
;
CR
LDX #$00
STX INSRTO
STX RVS
STX CSRMOD
STX CSRIDX
JSR NEWLIN
JMP CMD42A ;$E6DC
;====================================================================
; CKLNMI - Check line decrement
;
CKLNMI
LDX #$04
LDA #$00
CKLNLP
CMP CSRIDX
BEQ CKLND1 ;$E8F7
CLC
ADC #$16
DEX
BNE CKLNLP ;$E8EC
RTS
CKLND1
DEC CURROW
RTS
;====================================================================
; CKLNPL - Check for line increment
;
CKLNPL
LDX #$04
LDA #$15
CKLNINL
CMP CSRIDX
BEQ CKLNIN ;$E909
CLC
ADC #$16
DEX
BNE CKLNINL ;$E8FE
RTS
CKLNIN
LDX CURROW
CPX #$17
BEQ CKLNEX ;$E911
INC CURROW
CKLNEX
RTS
;====================================================================
; STCLRC - Set color code
;
STCLRC
LDX #$07
STCLRL
CMP COLRTB,X
BEQ SETCLR ;$E91D
DEX
BPL STCLRL ;$E914
RTS
SETCLR
STX CLCODE
RTS
; Table: Color code
COLRTB
.db $90, $05, $1C, $9F, $9C, $1E, $1F, $9E
; Table: ScreenCode <==> ASCII
XLATB1
.db $EF, $A1, $DF, $A6, $E1, $B1, $E2, $B2
.db $E3, $B3, $E4, $B4, $E5, $B5, $E6, $B6
.db $E7, $B7, $E8, $B8, $E9, $B9, $FA, $BA
.db $FB, $BB, $FC, $BC, $EC, $BD, $FE, $BE
.db $84, $BF, $F7, $C0, $F8, $DB, $F9, $DD
.db $EA, $DE, $5E, $E0, $5B, $E1, $5D, $E2
.db $40, $B0, $61, $B1, $78, $DB, $79, $DD
.db $66, $B6, $77, $C0, $70, $F0, $71, $F1
.db $72, $F2, $73, $F3, $74, $F4, $75, $F5
.db $76, $F6, $7D, $FD
;====================================================================
; SCRLSC - Scroll screen Evaluation
;
SCRLSC
LDA SAL
PHA
LDA SAL+1
PHA
LDA EAL
PHA
LDA EAL+1
PHA
SCLPUSH
LDX #$FF
DEC CURROW
DEC ICRROW
DEC SCROWM
SCRLP1
INX
JSR LINSTR
CPX #$16
BCS SCRL_S1 ;$E99D
LDA LBSCAD+1,X ;$EDFE,X
STA SAL
LDA SLLTBL+1,X
JSR MOVELN
BMI SCRLP1 ;$E989
SCRL_S1
JSR CLRLIN
LDX #$00
SCRLP2
LDA SLLTBL,X
AND #%01111111 ;$7F
LDY SLLTBL+1,X
BPL SCRL_S2 ;E9AC
ORA #%10000000 ;$B0 or 80
SCRL_S2
STA SLLTBL,X
INX
CPX #$16
BNE SCRLP2 ;$E9A2
LDA SLLTBL+22 ;$EF
ORA #%10000000 ;$B0 or 80
STA SLLTBL+22 ;$EF
LDA SLLTBL
BPL SCLPUSH ;$E981
INC CURROW
INC SCROWM
LDA #$FB
STA D2ORB
LDA D2ORA
CMP #$FE
PHP
LDA #$F7
STA D2ORB
PLP
BNE SCRL_S3 ;$E9DF
LDY #$00
SCRL_S2A
NOP
DEX
BNE SCRL_S2A ;E9D6
DEY
BNE SCRL_S2A ;E9D6
STY KEYCNT
SCRL_S3
LDX CURROW
PLA
STA EAL+1
PLA
STA EAL
PLA
STA SAL+1
PLA
STA SAL
RTS
;====================================================================
; INSSPC - Open a space on the screen
;
INSSPC
LDX CURROW
INSSLOP
INX
LDA SLLTBL,X
BPL INSSLOP ; $E9F0
STX SCROWM
CPX #$16
BEQ INSSPC1 ;$EA08
BCC INSSPC1
JSR SCRLSC
LDX SCROWM
DEX
DEC CURROW
JMP CSRSK2 ;$E70E
INSSPC1
LDA SAL
PHA
LDA SAL+1
PHA
LDA EAL
PHA
LDA EAL+1
PHA
LDX #$17
INSSLP2
DEX
JSR LINSTR
CPX SCROWM
BCC INSSPC2 ;$EA2C
BEQ INSSPC2 ;$EA2C
LDA LBSCAD-1,X ;$EDFC
STA SAL
LDA INSRTO,X
JSR MOVELN
BMI INSSLP2 ;$EA16
INSSPC2
JSR CLRLIN
LDX #$15
INSSLP3
CPX SCROWM
BCC INSEXIT ;$EA44
LDA SLLTBL+1,X
AND #%01111111 ;$7F
LDY SLLTBL,X
BPL INSSPC3 ;$EA3F
ORA #%10000000 ;$80
INSSPC3
STA SLLTBL+1,X
DEX
BNE INSSLP3 ;$EA31
INSEXIT
LDX SCROWM
JSR CSRSK2
PLA
STA EAL+1
PLA
STA EAL
PLA
STA SAL+1
PLA
STA SAL
RTS
;====================================================================
; MOVELN - Move a screen line
;
MOVELN
AND #%00000011 ;$03
ORA HIPAGE
STA SAL+1
JSR COPYCL
LDY #$15
MOVLOOP
LDA (SAL),Y
STA (LINPTR),Y
LDA (EAL),Y
STA (COLRPT),Y
DEY
BPL MOVLOOP ;$EA62
RTS
;====================================================================
; COPYCL - Synchronize color transfer
;
COPYCL
JSR BLINK
LDA SAL
STA EAL
LDA SAL+1
AND #%00000011 ;$03
ORA #%10010100 ;$94
STA EAL+1
RTS
;====================================================================
; LINSTR - Set start of line
;
LINSTR
LDA LBSCAD,X ;$EDFD
STA LINPTR
LDA SLLTBL,X
AND #%00000011 ;$03
ORA HIPAGE
STA LINPTR+1
RTS
;====================================================================
; CLRLIN - Clear screen line
;
CLRLIN
LDY #$15
JSR LINSTR
JSR BLINK
CLEARLP
LDA #$20 ;{space}
STA (LINPTR),Y
LDA #$01
STA (COLRPT),Y
DEY
BPL CLEARLP ;$EA95
RTS
;====================================================================
; PRNSCR - Print to screen
;
PRNSCR
TAY
LDA #$02
STA BLNCT
JSR BLINK
TYA
PRNSCR1
LDY CSRIDX
STA (LINPTR),Y
TXA
STA (COLRPT),Y
RTS
;====================================================================
; BLINK - Blink cursor
;
BLINK
LDA LINPTR
STA COLRPT
LDA LINPTR+1
AND #%00000011 ;$03
ORA #%10010100 ;$94
STA COLRPT+1
RTS
;====================================================================
; IRQVEC - IRQ Vector
;
IRQVEC
JSR UDTIM ;update clock F734
LDA BLNSW
BNE IRQVEC2 ;$EAEF
DEC BLNCT ;decrement blink count
BNE IRQVEC2 ;$EAEF
LDA #$14
STA BLNCT
LDY CSRIDX
LSR BLNON
LDX CSRCLR
LDA (LINPTR),Y
BCS IRQVEC1 ;$EAEA
INC BLNON
STA GDBLN
JSR BLINK
LDA (COLRPT),Y
STA CSRCLR
LDX CLCODE
LDA GDBLN
IRQVEC1
EOR #%10000000
JSR PRNSCR1
IRQVEC2
LDA D1ORAH
AND #%01000000 ;$40
BEQ IRQVEC3 ;$EB01
LDY #$00
STY CAS1
LDA D1PCR
ORA #%00000010 ;$02
BNE IRQVEC4 ;$EB0A
IRQVEC3
LDA CAS1
BNE IRQVEC5 ;$EB12
LDA D1PCR
AND #%11111101 ;$FD
IRQVEC4
BIT D1IER
BVS IRQVEC5 ;$EB12
STA D1PCR
IRQVEC5
JSR ISCNKY ;Eb1E
BIT D2TM1L ;9124
PLA
TAY
PLA
TAX
PLA
RTI
;====================================================================
; ISCNKY - Scan keyboard
;
ISCNKY
LDA #$00
STA SHFTFL
LDY #$40
STY KEYDN
STA D2ORB
LDX D2ORA
CPX #$FF
BEQ PROCK1A ;$EB8F
LDA #$FE
STA D2ORB
LDY #$00
LDA #$EA ;FIXUP2+2;#$5E
STA KEYTAB
LDA #$EA ;FIXUP2+3;#$EC
STA KEYTAB+1
ISCKLP1
LDX #$08
LDA D2ORA
CMP D2ORA
BNE ISCKLP1 ;$EB40
ISCKLP2
LSR A
BCS ISCNK1+3 ;$EB63
PHA
LDA (KEYTAB),Y
CMP #$05
BCS ISCNK1 ;$EB60
CMP #$03
BEQ ISCNK1 ;$EB60
ORA SHFTFL
STA SHFTFL
BPL ISCNK1+2 ;$EB62
ISCNK1
STY KEYDN
PLA
INY
CPY #$41
BCS ISCNEXIT ;$EB71
DEX
BNE ISCKLP2 ;$EB4A
SEC
ROL D2ORB
BNE ISCKLP1 ;$EB40
ISCNEXIT
JMP (FCEVAL)
;
; Process key image
;
PROCKY
LDY KEYDN
LDA (KEYTAB),Y
TAX
CPY CURKEY
BEQ PROCK1 ;$EB84
LDY #$10
STY KRPTDL
BNE PROCK4 ;$EBBA
PROCK1
AND #%01111111 ;$7F
BIT KEYRPT
BMI PROCK2 ;$EBA1
BVS PROCK5 ;$EBD6
CMP #$7F
PROCK1A
BEQ PROCK4 ;$EBBA
CMP #$14
BEQ PROCK2 ;$EBA1
CMP #$20
BEQ PROCK2 ;$EBA1
CMP #$1D
BEQ PROCK2 ;$EBA1
CMP #$11
BNE PROCK5 ;$EBD6
PROCK2
LDY KRPTDL
BEQ PROCK3 ;$EBAB
DEC KRPTDL
BNE PROCK5 ;$EBD6
PROCK3
DEC KRPTSP
BNE PROCK5 ;$EBD6
LDY #$04
STY KRPTSP
LDY KEYCNT
DEY
BPL PROCK5 ;$EBD6
PROCK4
LDY KEYDN
STY CURKEY
LDY SHFTFL
STY LSSHFT
CPX #$FF
BEQ PROCK5 ;$EBD6
TXA
LDX KEYCNT
CPX KBMAXL
BCS PROCK5 ;$EBD6
STA KBUFFR,X
INX
STX KEYCNT
PROCK5
LDA #$F7
STA D2ORB
RTS
;
; Unknown function (no apparent access)
;
PROCMORE
LDA SHFTFL
CMP #$03
BNE PROCK6A ;$EC0F
CMP LSSHFT
BEQ PROCK5 ;$EBD6
LDA SHMODE
BMI PROCKEX ;$EC43
.db $ea, $ea, $ea, $ea, $ea, $ea, $ea, $ea
.db $ea, $ea, $ea, $ea, $ea, $ea, $ea, $ea
.db $ea, $ea, $ea
LDA VRSTRT
EOR #$02
STA VRSTRT
.db $ea, $ea, $ea, $ea
PROCK6
JMP PROCKEX ;$EC43
PROCK6A
ASL A
CMP #$08
BCC $+6 ;$EC1B
LDA #$06
.db $ea, $ea, $ea, $ea, $ea, $ea, $ea, $ea
.db $ea, $ea, $ea, $ea, $ea, $ea, $ea, $ea
.db $ea, $ea, $ea, $ea, $ea, $ea, $ea, $ea
.db $ea, $ea, $ea, $ea, $ea, $ea, $ea, $ea
.db $ea, $ea
TAX
LDA KDECOD,X
STA KEYTAB
LDA KDECOD+1,X
STA KEYTAB+1
PROCKEX
JMP PROCKY
;====================================================================
; KDECOD - Pointers to keyboard decode tables
;
KDECOD
.dw KDECD1 ;$5E, $EC Unshifted
.dw KDECD2 ;$9F, $EC Shifted
.dw KDECD3 ;$E0, $EC Commodore
.dw KDECD5 ;$A3, $ED Control
.dw KDECD1 ;$EC5E Unshifted
.dw KDECD2 ;$EC9F Shifted
.dw KDECD4 ;$69, $ED Decode
.dw KDECD5 ;$EDA3 Control
.dw GRTXTF ;$21, $ED Graphics/text control
.dw KDECD4 ;$ED69 Decode
.dw KDECD4 ;$ED69 Decode
.dw KDECD5 ;$EDA3 Control
;
;Unshifted
;
KDECD1
.db $31, $33, $35, $37, $39, $2B
.db $5C, $14, $5F, $57, $52, $59, $49, $50
.db $2A, $0D, $04, $41, $44, $47, $4A, $4C
.db $3B, $1D, $03, $01, $58, $56, $4E, $2C
.db $2F, $11, $20, $5A, $43, $42, $4D, $2E
.db $01, $85, $02, $53, $46, $48, $4B, $3A
.db $3D, $86, $51, $45, $54, $55, $4F, $40
.db $5E, $87, $32, $34, $36, $38, $30, $2D
.db $13, $88, $FF
;
;shifted
;
KDECD2
.db $21, $23, $25, $27, $29
.db $DB, $A9, $94, $5F, $D7, $D2, $D9, $C9
.db $D0, $C0, $8D, $04, $C1, $C4, $C7, $CA
.db $CC, $5D, $9D, $83, $01, $D8, $D6, $CE
.db $3C, $3F, $91, $A0, $DA, $C3, $C2, $CD
.db $3E, $01, $89, $02, $D3, $C6, $C8, $CB
.db $5B, $3D, $8A, $D1, $C5, $D4, $D5, $CF
.db $BA, $DE, $8B, $22, $24, $26, $28, $30
.db $DD, $93, $8C, $FF
;
;Commodore
;
KDECD3
.db $21, $23, $25, $27
.db $29, $A6, $A8, $94, $5F, $B3, $B2, $B7
.db $A2, $AF, $DF, $8D, $04, $B0, $AC, $A5
.db $B5, $B6, $5D, $9D, $83, $01, $BD, $BE
.db $AA, $3C, $3F, $91, $A0, $AD, $BC, $BF
.db $A7, $3E, $01, $89, $02, $AE, $BB, $B4
.db $A1, $5B, $3D, $8A, $AB, $B1, $A3, $B8
.db $B9, $A4, $DE, $8B, $22, $24, $26, $28
.db $30, $DC, $93, $8C, $FF
;
;Graphics/tect control code
;@$ed21
GRTXTF
cmp #$0e
bne G1 ; +09
lda #$02
ora VRSTRT
sta VRSTRT
jmp CMD42A
G1 ;$ED30
cmp #$8E
bne G2
G1A
lda #$fd
and VRSTRT
sta VRSTRT
G1A1
jmp CMD42A
G2 ;$ED3F
cmp #$08
bne G3
lda #$80
ora SHMODE
sta SHMODE
bmi G1A1 ;$-ef
G3 ;$ED4D
cmp #$09
bne G1A1 ;$-eb
lda #%01111111 ;$7f
and SHMODE
sta SHMODE
bpl G1A1 ;$-e1
G4
inx
GRTX2
lda SLLTBL,x
ora #%10000000 ;$80
sta SLLTBL,x
dex
lda LINLEN
clc
jmp CSRMIN ;$e715
;ED21
;ED24
;ED2C
;ED34
;ED3C
;ED44
;ED4C
;ED54
;ED5C
;ED64
;
;Keyboard decoding table - Shifted
;
KDECD4
.db $FF, $FF, $FF
.db $FF, $FF, $FF, $FF, $FF, $FF, $04, $FF
.db $FF, $FF, $FF, $FF, $E2, $9D, $83, $01
.db $FF, $FF, $FF, $FF, $FF, $91, $A0, $FF
.db $FF, $FF, $FF, $EE, $01, $89, $02, $FF
.db $FF, $FF, $FF, $E1, $FD, $8A, $FF, $FF
.db $FF, $FF, $FF, $B0, $E0, $8B, $F2, $F4
.db $F6, $FF, $F0, $ED, $93, $8C, $FF
;
;Keyboard decoding table - control
;
KDECD5
.db $90
.db $1C, $9C, $1F, $12, $FF, $FF, $FF, $06
.db $FF, $12, $FF, $FF, $FF, $FF, $FF, $FF
.db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
.db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
.db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
.db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
.db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $05
.db $9F, $1E, $9E, $92, $FF, $FF, $FF, $FF
;
;VIC chip setup table
;
VICSUP
.db $05, $19, $16, $2E, $00, $C0, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $1B
;
;Shift-run equivalent
;
RUNSHF
.db $4C, $4F, $41, $44, $0D, $52, $55, $4E
.db $0D
;
;Low-byte screen address
;
LBSCAD
.db $00, $16, $2C, $42, $58, $6E, $84
.db $9A, $B0, $C6, $DC, $F2, $08, $1E, $34
.db $4A, $60, $76, $8C, $A2, $B8, $CE, $E4
;====================================================================
; ITALK - Send TALK command on serial bus (internal)
;
ITALK
ORA #%01000000 ;$40
;====================================================================
; ILISTN - Send LISTEN command on serial bus (internal)
;
ILISTN
.db $2C ;BIT $2009
ORA #%00100000 ;$20
JSR SBIDLE ;test IER for bus idle
LSNOIDLE
PHA
BIT C3PO
BPL LISN1 ;$EE2B
SEC
ROR SBITCF
JSR OTDSBU
LSR C3PO
LSR SBITCF
LISN1
PLA
STA BSOUT
JSR SOUT1 ;send DATA=1
CMP #%00111111 ;$3F
BNE LISN2 ;$EE38
JSR SCLK1 ;tsend SCLK=1
LISN2
LDA D1ORAH
ORA #%10000000 ;$B0/80?
STA D1ORAH
ILISTEX
JSR SCLK0 ;send SCLK=0
JSR SOUT1 ;send DATA=1
JSR DELAY ;wait
;====================================================================
; OTDSBU- Send data on serial bus
;
OTDSBU
SEI
JSR SOUT1
JSR SDCLK
LSR A
BCS FLGERR
JSR SCLK1
BIT SBITCF
BPL OTDLP3 ;$EE66
OTDLP1
JSR SDCLK
LSR A
BCC OTDLP1 ;$EE5A
OTDLP2
JSR SDCLK
LSR A
BCS OTDLP2 ;$EE60
OTDLP3
JSR SDCLK
LSR A
BCC OTDLP3 ;$EE66
JSR SCLK0
LDA #$08
STA CNTDN
OTDLP4
LDA D1ORAH
CMP D1ORAH
BNE OTDLP4 ;$EE73
LSR A
LSR A
BCC FLGER03 ;$EEB7
ROR BSOUT
BCS OTDSB1 ;$EE8B
JSR SOUT0
BNE OTDSB2 ;$EE8B
OTDSB1
JSR SOUT1
OTDSB2
JSR SCLK1
.db $EA, $EA, $EA, $EA
LDA D2PCR
AND #%11011111 ;$DF
ORA #%00000010 ;$02
STA D2PCR
DEC CNTDN
BNE OTDLP4 ;$EE73
LDA #$04
STA D2TM2H
OTDLP5
LDA D2IFR
AND #%00100000 ;$20
BNE FLGER03 ;$EEB7
JSR SDCLK
LSR A
BCS OTDLP5 ;$EEA5
CLI
RTS
;====================================================================
; FLGERR - Flag errors
;
FLGERR
LDA #$80 ; Error $80 - device not present
.db $2C
FLGER03
LDA #$03 ; Error $03 - write timeout
JSR ISETMS1 ;$FE6A External entry into ISETMS
CLI
CLC
BCC IUNLSN+5 ;$EF09
;====================================================================
; ISECND - Send LISTEN secondary address (internal)
;
ISECND
STA BSOUT
JSR ILISTEX ;$EE40 external entry into ILISTN
;CLK=0, DATA=1, pause
;
; CLRATN - Clear the ATN line
;
CLRATN
LDA D1ORAH ; release ATN
AND #%01111111 ;$7F
STA D1ORAH
RTS
;====================================================================
; ITKSA - Sent TALK secondary address (internal)
;
ITKSA
STA BSOUT
JSR ILISTEX ;$EE40 external entry into ILISTN
;CLK=0, DATA=1, pause
;
; Wait for CLK
;
CLKWAIT
SEI
JSR SOUT0
JSR CLRATN
JSR SCLK1
CLKWAIT1
JSR SDCLK
BCS CLKWAIT1 ;$EEDD
CLI
RTS
;====================================================================
; ICIOUT - Send serial deferred (internal)
;
ICIOUT
BIT C3PO
BMI ICIOUT1 ;$EEED
SEC
ROR C3PO
BNE ICIOUT2 ;$EEF2
ICIOUT1
PHA
JSR OTDSBU
PLA
ICIOUT2
STA BSOUT
CLC
RTS
;====================================================================
; IUNTLK - Send UNTALK on serial bus (internal)
;
IUNTLK
JSR SCLK0
LDA D1ORAH
ORA #%10000000 ;$B0/80
STA D1ORAH
LDA #$5F ;entry 1
.db $2C ;really BIT $3FA9 to skip EF04
;====================================================================
; IUNLSN - Send UNLISTEN on serial bus (internal)
;
IUNLSN
LDA #$3F ;entry 2
JSR LSNOIDLE ;$EE1C skip serial idle test
JSR CLRATN
TXA
LDX #$0B
IUNLP1
DEX
BNE IUNLP1 ;$EF0F
TAX
JSR SCLK1
JMP SOUT1
;====================================================================
; IACPTR - Receive from serial bus (internal)
;
IACPTR
SEI
LDA #$00
STA CNTDN
JSR SCLK1
IACPLP1
JSR SDCLK
BCC IACPLP1 ;$EF21
JSR SOUT1
IACPTR1
LDA #$01
STA D2TM2H
IACPLP2
LDA D2IFR
AND #%00100000 ;$20
BNE IACPTR2 ;$EF3C
JSR SDCLK
BCS IACPLP2 ;$EF2E
BCC IACPTR3A ;$EF54
IACPTR2
LDA CNTDN
BEQ IACPTR3 ;$EF45
LDA #$02 ;set eerror code to 2
JMP FLGER03+2 ;$EEB9
IACPTR3
JSR SOUT0
JSR IUNLSN+8 ;$EF0C
LDA #$40
JSR ISETMS+4 ;$FE6A
INC CNTDN
BNE IACPTR1 ;$EF29
IACPTR3A
LDA #$08
IACPLP3
STA CNTDN
IACPLP4
LDA D1ORAH
CMP D1ORAH
BNE IACPLP4 ;$EF56
LSR A
BCC IACPLP4 ;$EF58
LSR A
ROR CYCLE
IACPLP5
LDA D1ORAH
CMP D1ORAH
BNE IACPLP5 ;$EF66
LSR A
BCS IACPLP5 ;$EF66
DEC CNTDN
BNE IACPLP4 ;$EF58
JSR SOUT0
LDA CSTAT
BEQ IACPEX ;$EF7F
JSR IUNLSN+8
IACPEX
LDA CYCLE
CLI
CLC
RTS
;====================================================================
; SCLK1 - Set Serial CLK 1 (inverted logic)
;
SCLK1
LDA D2PCR
AND #%11111101 ;$FD
STA D2PCR
RTS
;====================================================================
; SCLK0 - Set Serial CLK 0
;
SCLK0
LDA D2PCR
ORA #%00000010 ;$02
STA D2PCR
RTS
;====================================================================
; DELAY - Delay 1ms
;
DELAY
LDA #$04
STA D2TM2H
DLYLOOP
LDA D2IFR
AND #%00100000 ;$20
BEQ DLYLOOP ;$EF9B
RTS
;====================================================================
; SSEND - RS-232 Send
;
SSEND
LDA BITTS
BEQ SSNDN
BMI SSEND1 ;$EFE8
LSR RODATA
LDX #$00
BCC SSEND2 ;$EFB0
DEX
SSEND2
TXA
EOR ROPRTY
STA ROPRTY
DEC BITTS
BEQ SSEND3 ;$EFBF
SSEND2A
TXA
AND #%00100000 ;$20
STA NXTBIT
RTS
SSEND3
LDA #$20
BIT M51CDR
BEQ SSEND5 ;$EFDA
BMI SSEND7 ;$EFE4
BVS SSEND6 ;$EFDE
LDA ROPRTY
BNE SSEND4A ;$EFCF
SSEND4
DEX
SSEND4A
DEC BITTS
LDA M51CTR
BPL SSEND2A ;$EFB9
DEC BITTS
BNE SSEND2A ;$EFB9
SSEND5
INC BITTS
BNE SSEND4 ;$EFCE
SSEND6
LDA ROPRTY
BEQ SSEND4A ;$EFCF
BNE SSEND4 ;$EFCE
SSEND7
BVS SSEND4A ;$EFCF
BVC SSEND4 ;$EFCE
SSEND1
INC BITTS
LDX #$FF
BNE SSEND2A ;$EFB9
;====================================================================
; SSNDN - Send new RS-232 byte
;
SSNDN
LDA M51CDR
LSR A
BCC SSNDN1 ;$EFFB
BIT D2ORB
BPL DSRERR
BVC CTSERR
SSNDN1
LDA #$00
STA ROPRTY
STA NXTBIT
LDX BITNUM
STX BITTS
LDY RODBS
CPY RODBE
BEQ DISTIM
LDA (ROBUF),Y
STA RODATA
INC RODBS
RTS
;====================================================================
; DSRERR - No DSR/CTS errors
;
DSRERR
LDA #$40 ; no DSR
.db $2C ;bit $10a9
;
; CTSERR - CTS Error
;
CTSERR
LDA #$10 ; no CTS
ORA RSSTAT
STA RSSTAT
;
; DISTIM - Disable timer
;
DISTIM
LDA #$40 ; disable timer
STA D1IER
RTS
;====================================================================
; BITCNT - Compute bit count
;
BITCNT
LDX #$09
LDA #$20
BIT M51CTR
BEQ BITCNT1 ;$F031
DEX
BITCNT1
BVC BITEXIT ;$F035
DEX
DEX
BITEXIT
RTS
;====================================================================
; SERRX - RS-232 Receive
;
SERRX
LDX RINONE
BNE PROCSB
DEC BITCI
BEQ PROCSB1 ;$F06F
BMI SERRX1 ;$F04D
LDA INBIT
EOR RIPRTY
STA RIPRTY
LSR INBIT
ROR RIDATA
SERRXEX
RTS
DEC BITCI
SERRX1
LDA INBIT
BEQ PRSBEX ;$F0B3
LDA M51CTR
ASL A
LDA #$01
ADC BITCI
BNE SERRXEX ;$F04A
;
; RXSET - Setup to receive
;
RXSET
LDA #$90
STA D1IER
STA RINONE
LDA #$20
STA D1IER
RTS
;====================================================================
; PROCSB - Process RS-232 byte
;
PROCSB
LDA INBIT
BNE RXSET
STA RINONE
RTS
PROCSB1
LDY RIDBE
INY
CPY RIDBS
BEQ SBE04 ;$F0A2
STY RIDBE
DEY
LDA RIDATA
LDX BITNUM
PRSBLP1
CPX #$09
BEQ PROCSB2 ;$F089
LSR A
INX
BNE PRSBLP1 ;$F081
PROCSB2
STA (RIBUF),Y
LDA #$20
BIT M51CDR
BEQ SERRX1-2 ;$F04B
BMI SERRXEX ;$F04A RTS
LDA INBIT
EOR RIPRTY
BEQ PROC_S1 ;$F09D
BVS SERRXEX ;$F04A
.db $2C
PROC_S1
BVC SERRXEX ;BIT $A850 = BVC+A8 f14b
SBE01
LDA #$01
.db $2C
SBE04
LDA #$04 ;BIT $04A9
.db $2C
SBE80
LDA #$80 ;BIT $80A9
.db $2C
SBE02
LDA #$02 ;BIT $02A9
ORA RSSTAT
STA RSSTAT
JMP RXSET
PRSBEX
LDA RIDATA
BNE SBE02 ;$F0A8
BEQ SBE80 ;$F0A5
JMP IOERMS9 ;$F796
;====================================================================
; SSUBBT - Submit to RS-232
;
SSUBBT
STA OUTDEV
LDA M51CDR
LSR A
BCC SSRETC ;$F0EB return OK
LDA #$02
BIT D1ORB
BPL SSRETE ;$F0E8 return DSR error
BNE SSRETC ;$F0EB
SSLOOP1
LDA D1IER
AND #%00110000 ;$30
BNE SSLOOP1 ;$F0CD
SSLOOP2
BIT D1ORB
BVS SSLOOP2 ;$F0D4
LDA D1ORB
ORA #$02
STA D1ORB
SSLOOP3
BIT D1ORB
BVS SSRETC ;$F0EB
BMI SSLOOP3 ;$F0E1
SSRETE
JSR DSRERR ;set DSR error
SSRETC
CLC
RTS
;====================================================================
; SSENDB - Send to RS-232 buffer
;
SSENDB
LDY RODBE
INY
CPY RODBS
BEQ SSENDB
STY RODBE
DEY
STA (ROBUF),Y
BIT D1IER
BVC SNDB1 ;$F102
RTS
SNDB1
LDA BAUDOF
STA D1TM1L
LDA BAUDOF+1
STA D1TM1L+1
LDA #%11000000 ;$C0
STA D1IER
JMP SSNDN
;====================================================================
; SERINP - Input from RS-232
;
SERINP
STA INDEV
LDA M51CDR
LSR A
BCC SINPEX2 ;$F146
AND #%00001000 ;$08
BEQ SINPEX2 ;$F146
LDA #$02
BIT D1ORB
BPL SSRETE ;$F0E8 DSR error
BEQ SINRETC ;$F144
SINPLP1
BIT D1IER
BVS SINPLP1 ;$F12B
LDA D1ORB
AND #%11111101 ;$FD
STA D1ORB
SINLP2
LDA D1ORB
AND #%00000100 ;$04
BEQ SINLP2 ;$F138
SINPEX1
LDA #%10010000 ;$90
STA D1IER
SINRETC
CLC
RTS
SINPEX2
LDA D1IER
AND #%00110000 ;$30
BEQ SINPEX1 ;$F13F
CLC
RTS
;====================================================================
; SERGET - Get from RS-232
;
SERGET
LDY RIDBS
CPY RIDBE
BEQ SERGET1 ;$F15D
LDA (RIBUF),Y
INC RIDBS
RTS
SERGET1
LDA #$00
RTS
;====================================================================
; SBIDLE - Serial bus idle
;
SBIDLE
PHA
LDA D1IER
BEQ SBIDLEX ;$F172
SBIDLLP
LDA D1IER
AND #$60
BNE SBIDLLP ;$F166
LDA #$10
STA D1IER
SBIDLEX
PLA
RTS
;====================================================================
; KIOMSG - KERNEL I/O messages
;
KIOMSG
.db $0D, "I/O ERROR ", $A3 ;00h
.db $0D, "SEARCHING", $A0, "FOR", $A0 ;0Ch
.db $0D, "PRESS PLAY ON TAP", $C5 ;1Bh
.db "PRESS RECORD & PLAY ON TAP", $C5 ;2Eh
.db $0D, "LOADIN", $C7 ;49h
.db $0D, "SAVING", $A0 ;51h
.db $0D, "VERIFYIN", $C7 ;59h
.db $0D, "FOUND", $A0 ;63h
.db $0D, "OK", $8D ;6Ah
;====================================================================
; DIRMSG - Print message to screen if Direct
;
DIRMSG
BIT CMDMOD
BPL MSGEXIT ;$F1F3
;
; MSG - Print message
;
MSG
LDA KIOMSG,Y ; Y = message#
PHP
AND #%01111111 ;$7F clear character shift
JSR CHROUT
INY
PLP
BPL MSG
MSGEXIT
CLC
RTS
;====================================================================
; IGETIN - Get a byte (internal)
;
IGETIN
LDA INDEV
BNE IGET232 ;$F201
LDA KEYCNT
BEQ GTSCEXC ;$F26A
SEI
JMP LP2
IGET232
CMP #$02 ;input from RS-232?
BNE CHINSCRN ;$F21D
IGETIN1
STY REGSAV
JSR SERGET
LDY REGSAV
CLC
RTS
;====================================================================
; ICHRIN - Input a byte (internal)
;
ICHRIN
LDA INDEV
BNE CHINSCRN ;$F21D not 0, must not be keyboard
LDA CSRIDX
STA ICRCOL
LDA CURROW
STA ICRROW
JMP INSCR ;$E64F
CHINSCRN
CMP #$03 ;screen?
BNE ICHRIN1 ;$F22A
STA INSRC
LDA LINLEN
STA EOLPTR
JMP INSCR ;$E64F
ICHRIN1
BCS GTTSCH1 ;$F264
CMP #$02 ;RS-232?
BEQ GTSCHLP ;$F26F
STX REGSAV
JSR GTTSCH
BCS ICHREXIT ;$F24D
PHA
JSR GTTSCH
BCS ICHRIN3 ;$F24A
BNE ICHRIN2 ;$F244
LDA #$40
JSR ISETMS+4 ;$FE6A
ICHRIN2
DEC BUFPNT
LDX REGSAV
PLA
RTS
ICHRIN3
TAX
PLA
TXA
ICHREXIT
LDX REGSAV
RTS
;====================================================================
; GTTSCH - Get input from tape/serial/RS-232
;
GTTSCH
JSR INCTPT
BNE GTTSCEX ;$F260
JSR TPREAD
BCS GTSCEXC+1 ;$F26B
LDA #$00
STA BUFPNT
BEQ GTTSCH ;$F250
GTTSCEX
LDA (TAPE1),Y
CLC
RTS
GTTSCH1
LDA CSTAT
BEQ GTTSCH2 ;$F26C
LDA #$0D
GTSCEXC
CLC
RTS
GTTSCH2
JMP IACPTR
GTSCHLP
JSR IGETIN1
BCS GTSCEX2 ;$F279
CMP #$00
BEQ GTSCHLP ;$F26F
CLC
GTSCEX2
RTS
;====================================================================
; ICHROT - Output one character (internal)
;
ICHROT
PHA
LDA OUTDEV
CMP #$03 ;screen?
BNE ONOTSCR ;$F285 no, skip
PLA
JMP OUTSCR ;send to screen
ONOTSCR
BCC OTIEEE ;$F28B serial - RS232 or IEEE?
PLA
JMP ICIOUT ;send to IEEE
OTIEEE
CMP #$02
BEQ OTRS232 ;$F2B9 send to RS232
PLA ;must be tape
OTIEEE1
STA TPTR1
PHA
TXA
PHA
TYA
PHA
JSR INCTPT ;increment tape pointer
BNE CHROT1 ;$F2AA
JSR TPWRIT ;write char
BCS CHROT1A ;$F2AF
LDA #$02
LDY #$00
STA (TAPE1),Y
INY
STY BUFPNT
CHROT1
LDA TPTR1
STA (TAPE1),Y
CLC
CHROT1A
PLA
CHROT2
TAY
PLA
TAX
PLA
BCC CHRRET ;$F2B8
LDA #$00
CHRRET
RTS
OTRS232
PLA
STX REGSAV
STY TPTR1
JSR SSENDB
LDX REGSAV
LDY TPTR1
CLC
RTS
;====================================================================
; ICHKIN - Set input device (internal)
;
ICHKIN
JSR FIND
BEQ ICHKI1 ;$F2CF
JMP IOERMS3 ;$F784
ICHKI1
JSR FLATRB
LDA CHANNL
BEQ ICHKI2 ;$F2EC
CMP #$03 ;SCREEN?
BEQ ICHKI2 ;$F2EC
BCS ICHKI3 ;$F2F0 IEEE?
CMP #$02 ;RS232?
BNE ICHK_S1 ;$F2E3
JMP SERINP ;go to serial input
ICHK_S1
LDX SECADR
CPX #$60
BEQ ICHKI2 ;$F2EC
JMP IOERMS6 ;$F78D
ICHKI2
STA INDEV
CLC
RTS
ICHKI3 ;handle IEEE
TAX
JSR ITALK
LDA SECADR
BPL ICHKI4 ;$F2FE
JSR CLKWAIT
JMP ICHKI4+3 ;$F301
ICHKI4
JSR ITKSA
TXA
BIT CSTAT
BPL ICHKI2 ;$F2EC
JMP IOERMS5 ;$F78A
;====================================================================
; ICHKOT - Set output device (internal)
;
ICHKOT
JSR FIND
BEQ ICHKO_S1 ;$F311
JMP IOERMS3 ;$F784 Press play
ICHKO_S1
JSR FLATRB
LDA CHANNL
BNE ICHKO_S2 ;$F31B
ICHKER7
JMP IOERMS7 ;$F790 dev0=kbd Verify
ICHKO_S2
CMP #$03 ;screen?
BEQ ICHKO1 ;$F32E
BCS ICHKO2 ;$F332 IEEE
CMP #$02 ;RS232?
BNE ICHKO_S3 ;$F328
JMP SSUBBT
ICHKO_S3
LDX SECADR ;devs 0, 1
CPX #$60
BEQ ICHKER7 ;$F318 tape verify
ICHKO1 ;screen
STA OUTDEV
CLC
RTS
ICHKO2 ;IEEE
TAX
JSR ILISTN+1
LDA SECADR
BPL ICHKO_S4 ;$F33F
JSR CLRATN
BNE ICHKO_S5 ;$F342
ICHKO_S4
JSR ISECND
ICHKO_S5
TXA
BIT CSTAT
BPL ICHKO1 ;$F32E
JMP IOERMS5 ;$F78A Loading
;====================================================================
; ICLOSE - Close file (internal)
;
ICLOSE
JSR FINDLOOP-2 ;$F3D4
BEQ ICLSE ;$F351
CLC
RTS
ICLSE
JSR FLATRB
TXA
PHA
LDA CHANNL
BEQ ICLSE4 ;$F3B1
CMP #$03 ;screen
BEQ ICLSE4 ;$F3B1
BCS ICLSE3 ;$F3AE
CMP #$02 ;RS232
BNE ICLSE1 ;$F38D
PLA
JSR ICLSE4+1 ;$F3B2
LDA #%01111101 ;$7D
STA D1IER
LDA #%00000110 ;$06
STA D1ORB
LDA #%11101110 ;$EE
STA D1PCR
JSR IMEMTP+2 ;$FE75
LDA RIBUF+1
BEQ ICLSE_S1 ;$F37F
INY
ICLSE_S1
LDA ROBUF+1
BEQ ICLSE_S2 ;$F384
INY
ICLSE_S2
LDA #$00
STA RIBUF+1
STA ROBUF+1
JMP SEROPN4 ;$F53C
ICLSE1
LDA SECADR
AND #%00001111 ;$0F
BEQ ICLSE4 ;$F3B1
JSR GETBFA ;$F84D
LDA #$00
JSR OTIEEE1 ;$F290 skips channel check
JMP TPWPCH ;$E4CF
ICLSE2
BCS ICLSEEX ;$F3CE
LDA SECADR
CMP #$62
BNE ICLSE4 ;$F3B1
LDA #$05
JSR WRTPHD
JMP ICLSE4 ;$F3B1
ICLSE3
JSR SERSAV1A
ICLSE4
PLA
TAX
DEC COPNFL
CPX COPNFL
BEQ ICLSEEX-1 ;$F3CD return CY=0
LDY COPNFL
LDA FILTBL,Y
STA FILTBL,X
LDA DEVTBL,Y
STA DEVTBL,X
LDA SECATB,Y
STA SECATB,X
CLC
ICLSEEX
RTS
;====================================================================
; FIND - Find file
;
FIND
LDA #$00
STA CSTAT
TXA
LDX COPNFL
FINDLOOP
DEX
BMI FLATRBX ;$F3EE
CMP FILTBL,X
BNE FINDLOOP ;$F3D6
RTS
;====================================================================
; FLATRB - Set file values
;
FLATRB
LDA FILTBL,X
STA LOGFIL
LDA DEVTBL,X
STA CHANNL
LDA SECATB,X
STA SECADR
FLATRBX
RTS
;====================================================================
; ICLALL - Abort all files (internal)
;
ICLALL
LDA #$00
STA COPNFL
;====================================================================
; ICLRCH - Restore default I/O (internal)
;
ICLRCH
LDX #$03
CPX OUTDEV ;is output device <=3
BCS ICLRCH_S1 ;$F3FC yes, continue
JSR IUNLSN ;send unlisten command
ICLRCH_S1
CPX INDEV ;is input device <=3
BCS ICLRCH_S2 ;$F403 yes, continue
JSR IUNTLK ;send untalk
ICLRCH_S2
STX OUTDEV
LDA #$00
STA INDEV
RTS
;====================================================================
; IOPEN - Open file (internal)
;
IOPEN
LDX LOGFIL
BNE IOPEN_S1 ;F411 <>0 not save
JMP IOERMS6 ;$F78D saving
IOPEN_S1
JSR FIND
BNE IOPEN_S2 ;F419
JMP IOERMS2 ;$F781 searching for
IOPEN_S2
LDX COPNFL
CPX #$0A ;10 files open?
BCC IOPEN_S3 ;F422
JMP IOERMS1 ;I/O error
IOPEN_S3
INC COPNFL
LDA LOGFIL
STA FILTBL,X
LDA SECADR
ORA #%01100000 ;$60
STA SECADR
STA SECATB,X
LDA CHANNL
STA DEVTBL,X
BEQ IOPENRC ;$F493 return clear
CMP #$03 ;screen?
BEQ IOPENRC ;$F493
BCC IOPEN_S4 ;F444
JSR SENDSA ;send secondary
BCC IOPENRC ;$F493 return clear
IOPEN_S4
CMP #$02 ;RS232?
BNE IOPEN_S5 ;F44B not RS232
JMP SEROPN
IOPEN_S5
JSR GETBFA ;not screen or RS232
BCS IOPEN_S6 ;F453
JMP IOERMS9 ;$F796 OK
IOPEN_S6
LDA SECADR
AND #%00001111 ;$0F
BNE IOPEN2 ;$F478
JSR PLAYMS
BCS IOPENRC+1 ;$F494 return CY=1
JSR SRCHMS ;searching
LDA FNMLEN
BEQ IOPEN1 ;F46F name found
JSR LOCSPH
BCC IOPEN3 ;$F482
BEQ IOPENRC+1 ;$F494 return CY=1
IOPENA
JMP IOERMS4 ;IOERMS4 F787
IOPEN1
JSR LOCTPH
BEQ IOPENRC+1 ;$F494
BCC IOPEN3 ;$F482
BCS IOPENA ;$F46C
IOPEN2
JSR RECDMS
BCS IOPENRC+1 ;$F494 return CY=1
LDA #$04
JSR WRTPHD
IOPEN3
LDA #$BF
LDY SECADR
CPY #$60
BEQ IOPENRC-2 ;$F491
LDY #$00
LDA #$02
STA (TAPE1),Y
TYA
STA BUFPNT
IOPENRC
CLC
RTS
;====================================================================
; SENDSA - Send secondary address
;
SENDSA
LDA SECADR
BMI SNDSARC ;$F4C5
LDY FNMLEN
BEQ SNDSARC ;$F4C5
LDA CHANNL
JSR ILISTN+1
LDA SECADR
ORA #%11110000 ;$F0
JSR ISECND ;$EEC0
LDA CSTAT
BPL SENDSA1 ;$F4B2
PLA
PLA
JMP IOERMS5 ;$F78A
SENDSA1
LDA FNMLEN
BEQ SNDSARU ;$F4C2
LDY #$00
SENDSALP
LDA (FNPTR),Y ;send chrout to filename
JSR ICIOUT
INY
CPY FNMLEN
BNE SENDSALP ;$F4B8
SNDSARU
JSR IUNLSN
SNDSARC
CLC
RTS
;====================================================================
; SEROPN - Open RS-232
;
SEROPN
LDA #%00000110 ;$06
STA D1DDRB
STA D1ORB
LDA #%11101110 ;$EE
STA D1PCR
LDY #$00
STY RSSTAT
SEROPLP
CPY FNMLEN
BEQ SEROPN1 ;$F4E7
LDA (FNPTR),Y
STA M51CTR,Y
INY
CPY #$04
BNE SEROPLP ;$F4D9
SEROPN1
JSR BITCNT
STX BITNUM
LDA M51CTR
AND #%00001111 ;$0F
BNE $+2 ;F4F4
ASL A
TAX
LDA R232TB-2,X ;$FF5A,X
ASL A
TAY
LDA R232TB-1,X ;$FF5B,X
ROL A
PHA
TYA
ADC #$C8
STA BAUDOF
PLA
ADC #$00
STA BAUDOF+1
LDA M51CDR
LSR A
BCC SEROPN2 ;$F51B
LDA D2ORB
ASL A
BCS SEROPN2 ;$F51B
JMP DSRERR
SEROPN2
LDA RIDBE
STA RIDBS
LDA RODBE
STA RODBS
JSR IMEMTP+2 ;$FE75
LDA RIBUF+1
BNE SEROPN3 ;$F533
DEY
STY RIBUF+1
STX RIBUF
SEROPN3
LDA ROBUF+1
BNE SEROPN4 ;$F53C
DEY
STY ROBUF+1
STX ROBUF
SEROPN4
SEC
LDA #$F0
JMP STOTOP ;$FE7B
;====================================================================
; ILOAD - Load RAM from device (internal)
;
ILOAD
STX MEMUSS ;save load location
STY MEMUSS+1
JMP (LLODVP)
;====================================================================
; LNKLOD - Load RAM (indirect from $0330)
;
LNKLOD
STA IOFLG2
LDA #$00
STA CSTAT
LDA CHANNL
BNE LINK_S1 ;$F556
LNKLDEX
JMP IOERMS9 ;$F796 OK
LINK_S1
CMP #$03 ;screen?
BEQ LNKLDEX ;$F553
BCC TAPLOA ;F5CA <3, must be tape
;
; SERLOA - Load file from serial bus
;
SERLOA
LDY FNMLEN
BNE SERLO_S1 ;F563
JMP IOERMS8 ;$F793 found
SERLO_S1
JSR SSADR ;$E4BC
LDA #$60
STA SECADR
JSR SENDSA
LDA CHANNL
JSR ITALK
LDA SECADR
JSR ITKSA
JSR IACPTR
STA EAL
LDA CSTAT
LSR A
LSR A
BCS SERLDEX ;$F5C7
JSR IACPTR
STA EAL+1
JSR SLDPCH ;$E4C1
SERLDLP
LDA #$FD
AND CSTAT
STA CSTAT
JSR STOP
BNE SERLO_S2 ;F598
JMP SAVEXIT1 ;$F6CE
SERLO_S2
JSR IACPTR
TAX
LDA CSTAT
LSR A
LSR A
BCS SERLDLP ;$F58A
TXA
LDY IOFLG2
BEQ SERLD1 ;$F5B3
LDY #$00
CMP (EAL),Y
BEQ SERLD2 ;$F5B5
LDA #$10
JSR ISETMS1 ;$FE6A
.db $2C ;bit $ae91
SERLD1
STA (EAL),Y
SERLD2
INC EAL
BNE SERLO_S3 ;$F5BB
INC EAL+1
SERLO_S3
BIT CSTAT
BVC SERLDLP ;$F58A
JSR IUNTLK
JSR SERSAV1A
BCC TPLOAEX ;$F641
SERLDEX
JMP IOERMS4 ;$F787 play & rec
;====================================================================
; TAPLOA - Load file from tape
;
TAPLOA
CMP #$02
BNE TPLOA_S1 ;F5D1
JMP SSUBBT-3 ;IOERMS9
TPLOA_S1
JSR GETBFA
BCS TPLOA_S2 ;F5D9
JMP IOERMS9 ;$F796
TPLOA_S2
JSR PLAYMS
BCS TPLORTS
JSR SRCHMS
TAPLOALP
LDA FNMLEN
BEQ TAPLOA1 ;$F5EE
JSR LOCSPH
BCC TAPLOA2 ;$F5F5
BEQ TPLORTS
BCS SERLDEX ;$F5C7
TAPLOA1
JSR LOCTPH
BEQ TPLORTS
BCS SERLDEX ;$F5C7
TAPLOA2
LDA CSTAT
AND #%00010000 ;$10
SEC
BNE TPLORTS
CPX #$01
BEQ TAPLOA3 ;$F611
CPX #$03
TAPLOA2A
BNE TAPLOALP ;$F5E1
TAPLOALP2
LDY #$01
LDA (TAPE1),Y
STA MEMUSS
INY
LDA (TAPE1),Y
STA MEMUSS+1
BCS TAPLOA4 ;$F615
TAPLOA3
LDA SECADR
BNE TAPLOALP2 ;F604
TAPLOA4
LDY #$03
LDA (TAPE1),Y
LDY #$01
SBC (TAPE1),Y
TAX
LDY #$04
LDA (TAPE1),Y
LDY #$02
SBC (TAPE1),Y
TAY
CLC
TXA
ADC MEMUSS
STA EAL
TYA
ADC MEMUSS+1
STA EAL+1
LDA MEMUSS
STA STAL
LDA MEMUSS+1
STA STAL+1
JSR LOADMS
JSR TPREAD2 ;$F8C9
.db $24 ;BIT LASTPT+1
TPLOAEX
CLC
LDX EAL
LDY EAL+1
TPLORTS
RTS
;====================================================================
; SRCHMS - Print Searching
;
SRCHMS
LDA CMDMOD
BPL SRCHEX ;$F669
LDY #KIM_SRCH ;Searching for
JSR MSG
LDA FNMLEN
BEQ SRCHEX ;$F669
LDY #$17 ;point to FOR in Searching For
JSR MSG
;
; FLNMMS - Print filename
;
FLNMMS
LDY FNMLEN
BEQ SRCHEX ;$F669
LDY #$00
FLNMLP
LDA (FNPTR),Y
JSR CHROUT
INY
CPY FNMLEN
BNE FLNMLP ;$F65F
SRCHEX
RTS
;====================================================================
; LOADMS - Print Loading or Verifying
;
LOADMS
LDY #KIM_LOAD ;Loading
LDA IOFLG2
BEQ DOMESG ;$F672
LDY #KIM_VERF ;Verifying
DOMESG
JMP DIRMSG
;====================================================================
; ISAVE - Save RAM to device
;
ISAVE
STX EAL
STY EAL+1
TAX
LDA USRPOK,X
STA STAL
LDA USRVEC,X
STA STAL+1
JMP (LSAVVP)
;====================================================================
; LNKSAV - Link to SAVE (indirect from $0302)
;
LNKSAV
LDA CHANNL ;Get current device
BNE LNKSV_S2 ;F68C Not 0, continue
LNKSV_S1
JMP IOERMS9 ;$F796 OK
LNKSV_S2
CMP #$03 ;Device 3 (printer 3-5)
BEQ LNKSV_S1 ;$F689
BCC TAPESV
;
; SERSAV - Save to serial bus
;
SERSAV
LDA #$61
STA SECADR
LDY FNMLEN
BNE SERSAV_S1 ;$F69D
JMP IOERMS8 ;$F793 found
SERSAV_S1
JSR SENDSA
JSR SAVEMS
LDA CHANNL
JSR ILISTN+1
LDA SECADR
JSR ISECND
LDY #$00
JSR RSTTPP
LDA SAL
JSR ICIOUT
LDA SAL+1
JSR ICIOUT
SERSAVLP
JSR CKWRPT
BCS SERSAV1 ;$F6D7
LDA (SAL),Y
JSR ICIOUT
JSR STOP
BNE SAVEXIT2
SAVEXIT1
JSR SERSAV1A ;$F6DA
SAVEXIT
LDA #$00
SEC
RTS
SAVEXIT2
JSR INCRDP ;$FD1B
BNE SERSAVLP ;$F6BC
SERSAV1
JSR IUNLSN
SERSAV1A
BIT SECADR
BMI SERSAVRC ;$F6EF
LDA CHANNL
JSR ILISTN+1
LDA SECADR
AND #%11101111 ;$EF
ORA #%11100000 ;$E0
JSR ISECND
JSR IUNLSN
SERSAVRC
CLC
RTS
;====================================================================
; TAPESV - Save to tape
;
TAPESV
CMP #$02
BNE TPSAV_S1 ;$F6F8
JMP SSUBBT-3 ;IOERMS9
TPSAV_S1
JSR GETBFA
BCC LNKSAV+4 ;LNKSAV+4 $F689 JMP IOERMS9
JSR RECDMS
BCS TPSVRET ;$F727 RTS
JSR SAVEMS ;print saving message
LDX #$03
LDA SECADR
AND #%00000001 ;$01
BNE TPSAV_S2 ;$F70F
LDX #$01
TPSAV_S2
TXA
JSR WRTPHD
BCS TPSVRET ;$F727
JSR TPWRIT+3 ;$F8E6
BCS TPSVRET ;$F727
LDA SECADR
AND #%00000010 ;$02
BEQ TPSVRET-1 ;$F726 exit with CLC
LDA #$05
JSR WRTPHD
.db $24 ; BIT $18
CLC
TPSVRET
RTS
;====================================================================
; SAVEMS - Print Saving
;
SAVEMS
LDA CMDMOD
BPL TPSVRET ;$F727
LDY #KIM_SAVE ;'Saving
JSR MSG
JMP FLNMMS ;print filename
;====================================================================
; IUDTIM - Update RTC (internal)
;
IUDTIM
LDX #$00
INC CTIMR2
BNE UDTIM1 ;$F740
INC CTIMR1
BNE UDTIM1 ;$F740
INC CTIMR0
UDTIM1
SEC
LDA CTIMR2
SBC #$01
LDA CTIMR1
SBC #$1A
LDA CTIMR0
SBC #$4F
BCC UDTIM2 ;$F755
STX CTIMR0
STX CTIMR1
STX CTIMR2
UDTIM2
LDA D2ORAH
CMP D2ORAH
BNE UDTIM2 ;$F755
STA STKEY
RTS
;====================================================================
; IRDTIM - Read RTC (internal)
;
IRDTIM
SEI
LDA CTIMR2
LDX CTIMR1
LDY CTIMR0
;====================================================================
; ISETTM - Set RTC (internal)
;
ISETTM
SEI
STA CTIMR2
STX CTIMR1
STY CTIMR0
CLI
RTS
;====================================================================
; ISTOP - Check STOP key
;
ISTOP
LDA STKEY
CMP #%11111110 ;$FE
BNE ISTOPEX ;$F77D
PHP
JSR CLRCH
STA KEYCNT
PLP
ISTOPEX
RTS
;====================================================================
;IOERMS - I/O Error Message Table register load
; All use the BIT $xxA9 trick to skip unused entries
;
IOERMS1
LDA #$01 ;I/O Error
.db $2C
IOERMS2
LDA #$02 ;Searching for
.db $2C
IOERMS3
LDA #$03 ;Press Play on Tape
.db $2C
IOERMS4
LDA #$04 ;Press Record & Play on Tape
.db $2C
IOERMS5
LDA #$05 ;Loading
.db $2C
IOERMS6
LDA #$06 ;Saving
.db $2C
IOERMS7
LDA #$07 ;Verifying
.db $2C
IOERMS8
LDA #$08 ;Found
.db $2C
IOERMS9
LDA #$09 ;OK
PHA
JSR CLRCH
LDY #$00
BIT CMDMOD
BVC IOERMSEX ;$F7AC
JSR MSG ;Error 0-I/O Error
PLA
PHA
ORA #%00110000 ;$30
JSR CHROUT
IOERMSEX
PLA
SEC
RTS
;====================================================================
; LOCTPH - Find any tape header
;
LOCTPH
LDA IOFLG2
PHA
JSR TPREAD
PLA
STA IOFLG2
BCS LOCTPEX ;F7E6
LDY #$00
LDA (TAPE1),Y
CMP #$05
BEQ LOCTPEX ;$F7E6
CMP #$01
BEQ LOCTP1 ;$F7CE
CMP #$03
BEQ LOCTP1 ;$F7CE
CMP #$04
BNE LOCTPH
LOCTP1
TAX
BIT CMDMOD
BPL LOCTPEX-2 ;$F7E4 return CLC
LDY #KIM_FOUN ;Found
JSR MSG
LDY #$05
LOCLOOP
LDA (TAPE1),Y
JSR CHROUT
INY
CPY #$15
BNE LOCLOOP ;$F7DA
CLC
DEY
LOCTPEX
RTS
;====================================================================
; WRTPHD - Write tape header
;
WRTPHD
STA TPTR1
JSR GETBFA
BCC WRTPEX ;$F84C
LDA STAL+1
PHA
LDA STAL
PHA
LDA EAL+1
PHA
LDA EAL
PHA
LDY #$BF
LDA #$20
WRTPLP1
STA (TAPE1),Y
DEY
BNE WRTPLP1 ;$F7FE
LDA TPTR1
STA (TAPE1),Y
INY
LDA STAL
STA (TAPE1),Y
INY
LDA STAL+1
STA (TAPE1),Y
INY
LDA EAL
STA (TAPE1),Y
INY
LDA EAL+1
STA (TAPE1),Y
INY
STY TPTR2
LDY #$00
STY TPTR1
WRTPLP2
LDY TPTR1
CPY FNMLEN
BEQ WRTPH1 ;$F834
LDA (FNPTR),Y
LDY TPTR2
STA (TAPE1),Y
INC TPTR1
INC TPTR2
BNE WRTPLP2 ;$F822
WRTPH1
JSR SETBST
LDA #$69
STA RIPRTY
JSR TPWRIT1 $F8EA
TAY
PLA
STA EAL
PLA
STA EAL+1
PLA
STA STAL
PLA
STA STAL+1
TYA
WRTPEX
RTS
;====================================================================
; GETBFA - Get buffer address
;
GETBFA
LDX TAPE1
LDY TAPE1+1
CPY #$02
RTS
;====================================================================
; SETBST - Set buffer start/end pointers
;
SETBST
JSR GETBFA
TXA
STA STAL
CLC
ADC #$C0
STA EAL
TYA
STA STAL+1
ADC #$00
STA EAL+1
RTS
;====================================================================
; LOCSPH- Find specific tape header
;
LOCSPH
JSR LOCTPH
BCS LCSPEXC+1 ;$F889 return
LDY #$05
STY TPTR2
LDY #$00
STY TPTR1
LCSPHLP
CPY FNMLEN
BEQ LCSPEXC ;$F888 return CLC
LDA (FNPTR),Y
LDY TPTR2
CMP (TAPE1),Y
BNE LOCSPH ;f867
INC TPTR1
INC TPTR2
LDY TPTR1
BNE LCSPHLP ;$F874
LCSPEXC
CLC
RTS
;====================================================================
; INCTPT - Bump tape pointer
;
INCTPT
JSR GETBFA
INC BUFPNT
LDY BUFPNT
CPY #$C0
RTS
;====================================================================
; PLAYMS - Print Press Play on Tape
;
PLAYMS
JSR TPSTAT
BEQ TPSTEX ;$F8B5 exit
LDY #KIM_PLAY ;Press Play...
JSR MSG
WTPLAY
JSR TPSTOP
JSR TPSTAT
BNE WTPLAY ;$F89E wait for PLAY switch
LDY #KIM_OK ;OK
JMP MSG
;====================================================================
; TPSTAT - Check tape status
;
TPSTAT
LDA #%01000000 ;$40
BIT D1ORAH ;switch sense
BNE TPSTEX ;$F8B5
BIT D1ORAH
TPSTEX
CLC
RTS
;====================================================================
; RECDMS - Print Press Record on Tape
;
RECDMS
JSR TPSTAT
BEQ TPSTEX ;$F8B5
LDY #KIM_RECP ;Press Play & Record
BNE WTPLAY-3 ;$F89B JSR MSG
;====================================================================
; TPREAD - Initiate tape read
;
TPREAD
LDA #$00
STA CSTAT
STA IOFLG2
TPREAD1
JSR SETBST
TPREAD2
JSR PLAYMS
BCS TPCODE-2 ;$F8ED
SEI
LDA #$00
STA RIDATA
STA BITTS
STA TPCON1
STA TPTR1
STA TPTR2
STA BYTINF
LDA #$82
LDX #$0E
BNE TPCODE1 ;$F8F4
;====================================================================
; TPWRIT - Initiate tape write
;
TPWRIT
JSR SETBST
LDA #$14
STA RIPRTY
TPWRIT1
JSR RECDMS
BCS TPSTPX1 ;$F957
;
; TPCODE - Common tape code
;
TPCODE
SEI
LDA #%10100000 ;$A0
LDX #%00001000 ;$08
TPCODE1
LDY #%01111111 ;$7F
STY D2IER
STA D2IER
JSR SBIDLE
LDA IRQVP ;save current IRQ Vector
STA TAPIRQ
LDA IRQVP+1
STA TAPIRQ+1
JSR STOIRQ1 ;$FCFB .X=8 set tape IRQ vectors
LDA #$02
STA FSBLK
JSR NCHAR
LDA D1PCR
AND #%11111101 ;$FD
ORA #%00001100 ;$0C
STA D1PCR
STA CAS1
LDX #$FF ;setup loop
LDY #$FF
TPCDLP1
DEY
BNE TPCDLP1 ;$F925
DEX
BNE TPCDLP1-2 ;$F923 outside loop
STA D2TM2H
CLI
TPCDLP2
LDA TAPIRQ+1
CMP IRQVP+1
CLC
BEQ TPSTPX1 ;$F957
JSR TPSTOP
LDA D2IFR
AND #%01000000 ;$40
BEQ TPCDLP2 ;$F92F
LDA D1TM1L
JSR IUDTIM
JMP TPCDLP2 ;$F92F
;====================================================================
; TPSTOP - Check tape stop
;
TPSTOP
JSR STOP
CLC
BNE TPSTPX ;$F95C
JSR RESIRQ
SEC
PLA
PLA
TPSTPX1
LDA #$00
STA TAPIRQ+1
TPSTPX
RTS
;====================================================================
; SETRDT - Set read timing
;
SETRDT
STX TPCON2
LDA TPCON1
ASL A
ASL A
CLC
ADC TPCON1
CLC
ADC TPCON2
STA TPCON2
LDA #$00
BIT TPCON1
BMI SETRD_S1 ;$F972
ROL A
SETRD_S1
ASL TPCON2
ROL A
ASL TPCON2
ROL A
TAX
RDTLP1
LDA D2TM2L
CMP #$15
BCC RDTLP1 ;$F979
ADC TPCON2
STA D2TM1L
TXA
ADC D2TM2H
STA D2TM1L+1
CLI
RTS
;====================================================================
; RDTPBT - Read tape bits
;
RDTPBT
LDX D2TM2H
LDY #$FF
TYA
SBC D2TM2L
CPX D2TM2H
BNE RDTPBT
STX TPCON2
TAX
STY D2TM2L
STY D2TM2H
TYA
SBC TPCON2
STX TPCON2
LSR A
ROR TPCON2
LSR A
ROR TPCON2
LDA TPCON1
CLC
ADC #$3C
BIT D2ORA
CMP TPCON2
BCS RDTP4 ;$FA06
LDX BYTINF
BEQ RDTPB_S1 ;F9C3
JMP STORTC ;save tape IRQs
RDTPB_S1
LDX SBITCF
BMI RDTP1 ;$F9E2
LDX #$00
ADC #$30
ADC TPCON1
CMP TPCON2
BCS RDTP2 ;$F9ED
INX
ADC #$26
ADC TPCON1
CMP TPCON2
BCS RDTP3 ;$F9F1
ADC #$2C
ADC TPCON1
CMP TPCON2
BCC RDTPLP1 ;$F9E5
RDTP1
JMP RDTP6A ;$FA60
RDTPLP1
LDA BITTS
BEQ RDTP4 ;$FA06
STA BITCI
BNE RDTP4 ;$FA06
RDTP2
INC RINONE
BCS RDTP3A ;$F9F3
RDTP3
DEC RINONE
RDTP3A
SEC
SBC #$13
SBC TPCON2
ADC SVXT
STA SVXT
LDA CYCLE
EOR #$01
STA CYCLE
BEQ RDTP3C ;$FA25
STX LASTKY
RDTP4
LDA BITTS
BEQ RDTPEX1 ;$FA22
BIT D2IFR
BVC RDTPEX1 ;$FA22
LDA #$00
STA CYCLE
LDA SBITCF
BPL RDTP6 ;$FA47
BMI RDTP1 ;$F9E2
RDTP3B
LDX #$A6
JSR SETRDT
LDA TPRTY
BNE RDTPLP1 ;$F9E5
RDTPEX1
JMP EOI
RDTP3C
LDA SVXT
BEQ RDTP5A ;$FA30
BMI RDTP5 ;$FA2E
DEC TPCON1
.db $2C ;bit $b0e6
RDTP5
INC TPCON1
RDTP5A
LDA #$00
STA SVXT
CPX LASTKY
BNE RDTP6 ;$FA47
TXA
BNE RDTPLP1 ;$F9E5
LDA RINONE
BMI RDTP4 ;$FA06
CMP #$10
BCC RDTP4 ;$FA06
STA EOTFLG
BCS RDTP4 ;$FA06
RDTP6
TXA
EOR TPRTY
STA TPRTY
LDA BITTS
BEQ RDTPEX1 ;$FA22
DEC SBITCF
BMI RDTP3B ;$FA19
LSR LASTKY
ROR MYCH
LDX #$DA
JSR SETRDT
JMP EOI
RDTP6A
LDA EOTFLG
BEQ RDTP7 ;$FA68
LDA BITTS
BEQ RDTP8 ;$FA6C
RDTP7
LDA SBITCF
BPL RDTP3 ;$F9F1
RDTP8
LSR TPCON2
LDA #$93
SEC
SBC TPCON2
ADC TPCON1
ASL A
TAX
JSR SETRDT
INC BYTINF
LDA BITTS
BNE RDTP9 ;$FA91
LDA EOTFLG
BEQ RDTPEX2 ;$FAAA
STA BITCI
LDA #$00
STA EOTFLG
LDA #%11000000 ;$C0
STA D2IER
STA BITTS
RDTP9
LDA EOTFLG
STA NXTBIT
BEQ RDTP10 ;$FAA0
LDA #$00
STA BITTS
LDA #%01000000 ;$40
STA D2IER
RDTP10
LDA MYCH
STA ROPRTY
LDA BITCI
ORA RINONE
STA RODATA
RDTPEX2
JMP EOI
;====================================================================
; STORTC - Store tape characters
;
STORTC
JSR NCHAR
STA BYTINF
LDX #$DA
JSR SETRDT
LDA FSBLK
BEQ STOTC_S1 ;FABD
STA INBIT
STOTC_S1
LDA #$0F
BIT RIDATA
BPL STOTC1 ;FADA
LDA NXTBIT
BNE STOTCEX1 ;$FAD3
LDX FSBLK
DEX
BNE STOTCEX1A ;$FAD7
LDA #$08
JSR ISETMS1
BNE STOTCEX1A
STOTCEX1
LDA #$00
STA RIDATA
STOTCEX1A
JMP EOI
STOTC1
BVS STOTC4A ;$FB0D
BNE STOTC3 ;$FAF6
LDA NXTBIT
BNE STOTCEX1A
LDA RODATA
BNE STOTCEX1A
LDA INBIT
LSR A
LDA ROPRTY
BMI STOTC2 ;$FAF0
BCC STOTC4 ;$FB07
CLC
STOTC2
BCS STOTC4 ;$FB07
AND #%00001111 ;$0F
STA RIDATA
STOTC3
DEC RIDATA
BNE STOTCEX1A
LDA #$40
STA RIDATA
JSR RSTTPP
LDA #$00
STA RIPRTY
BEQ STOTCEX1A
STOTC4
LDA #$80
STA RIDATA
BNE STOTCEX1A
STOTC4A
LDA NXTBIT
BEQ STOTC5 ;$FB1B
LDA #$04
JSR ISETMS1 ;$FE6A
LDA #$00
JMP STOTC11A ;$FB97
STOTC5
JSR CKWRPT
BCC STOTC_S2 ;$FB23
JMP STOTC11 ;$FB95
STOTC_S2
LDX INBIT
DEX
BEQ STOTC7 ;$FB55
LDA IOFLG2
BEQ STOTC6 ;$FB38
LDY #$00
LDA ROPRTY
CMP (SAL),Y
BEQ STOTC6 ;$FB38
LDA #$01
STA RODATA
STOTC6
LDA RODATA
BEQ STOTC10 ;$FB87
LDX #$3D
CPX TPTR1
BCC STOTC9 ;$FB80
LDX TPTR1
LDA SAL+1
STA FBUFFR+1,X
LDA SAL
STA FBUFFR,X
INX
INX
STX TPTR1
JMP STOTC10 ;$FB87
STOTC7
LDX TPTR2
CPX TPTR1
BEQ STOTC10A ;$FB90
LDA SAL
CMP FBUFFR,X
BNE STOTC10A ;$FB90
LDA SAL+1
CMP FBUFFR+1,X
BNE STOTC10A ;$FB90
INC TPTR2
INC TPTR2
LDA IOFLG2
BEQ STOTC8 ;$FB7C
LDA ROPRTY
LDY #$00
CMP (SAL),Y
BEQ STOTC10A ;$FB90
INY
STY RODATA
STOTC8
LDA RODATA
BEQ STOTC10 ;$FB87
STOTC9
LDA #$10
JSR ISETMS1 ;$FE6A
BNE STOTC10A ;$FB90
STOTC10
LDA IOFLG2
BNE STOTC10A ;$FB90
TAY
LDA ROPRTY
STA (SAL),Y
STOTC10A
JSR INCRDP
BNE STOEX ;$FBCF
STOTC11
LDA #$80
STOTC11A
STA RIDATA
LDX FSBLK
DEX
BMI STOTC_S3 ;$FBA0
STX FSBLK
STOTC_S3
DEC INBIT
BEQ STOTC12 ;$FBAC
LDA TPTR1
BNE STOEX ;$FBCF
STA FSBLK
BEQ STOEX ;$FBCF
STOTC12
JSR RESIRQ
JSR RSTTPP
LDY #$00
STY RIPRTY
STORTLP1
LDA (SAL),Y
EOR RIPRTY
STA RIPRTY
JSR INCRDP
JSR CKWRPT
BCC STORTLP1 ;$FBB6
LDA RIPRTY
EOR ROPRTY
BEQ STOEX
LDA #$20
JSR ISETMS1 ;$FE6A
STOEX
JMP EOI
;====================================================================
; RSTTPP - Reset tape pointer
;
RSTTPP
LDA STAL+1
STA SAL+1
LDA STAL
STA SAL
RTS
;====================================================================
; NCHAR - New character setup
;
NCHAR
LDA #$08
STA SBITCF
LDA #$00
STA CYCLE
STA BITCI
STA TPRTY
STA RINONE
RTS
;====================================================================
; TONE - Send tone to tape
;
TONE
LDA ROPRTY
LSR A ;determine tone length
LDA #$60 ;set short tone timing
BCC TONE1 ;$FBF3 C=clear, 0
TONEA
LDA #$B0 ;set long tone time
TONE1
LDX #$00
STA D2TM2L
STX D2TM2H
LDA D2ORB
EOR #%00001000 ;$08
STA D2ORB
AND #%00001000
RTS
;====================================================================
; TWRDTA - Write data to tape
;
TWRDTA
SEC
ROR SAL+1
BMI TWRDEX1 ;fc47
TWRD7
LDA BITCI
BNE TWRD1 ;$FC21
LDA #$10
LDX #$01
JSR TONE1+2 ;$FBF5
BNE TWRDEX1 ;fc47
INC BITCI
LDA SAL+1
BPL TWRDEX1 ;fc47
JMP WRLEDR
TWRD1
LDA RINONE
BNE TWRD2A ;$FC2B
JSR TONEA ;$FBF1
BNE TWRDEX1 ;fc47
TWRD2
INC RINONE ;LDA #$D0
BNE TWRDEX1 ;ORA Y
TWRD2A
JSR TONE
BNE TWRDEX1 ;fc47
LDA CYCLE
EOR #$01
STA CYCLE
BEQ TWRD3 ;$FC4A
LDA ROPRTY
EOR #$01
STA ROPRTY
AND #$01
EOR TPRTY
STA TPRTY
TWRDEX1
JMP EOI
TWRD3
LSR ROPRTY
DEC SBITCF
LDA SBITCF
BEQ TWRD6 ;$FC8C
BPL TWRDEX1 ;fc47
TWRD3A
JSR NCHAR
CLI
LDA CNTDN
BEQ TWRD4 ;$FC6E
LDX #$00
STX LASTKY
DEC CNTDN
LDX FSBLK
CPX #$02
BNE TWRD_S1 ;FC6A
ORA #%10000000 ;$80
TWRD_S1
STA ROPRTY ;$BD
BNE TWRDEX1 ;fc47
TWRD4
JSR CKWRPT
BCC TWRD5 ;$FC7D
BNE TWRDTA
INC SAL+1
LDA LASTKY
STA ROPRTY
BCS TWRDEX1 ;fc47
TWRD5
LDY #$00
LDA (SAL),Y
STA ROPRTY
EOR LASTKY
STA LASTKY
JSR INCRDP
BNE TWRDEX1 ;fc47
TWRD6
LDA TPRTY
EOR #$01
STA ROPRTY
TPEOI
JMP EOI
;====================================================================
; WRLEDR - Write tape leader
;
WRLEDR
DEC FSBLK
BNE WRLDR1 ;$FC9C
JSR NOMOTR
WRLDR1
LDA #$50
STA INBIT
LDX #$08
SEI
JSR STOIRQ1 ;$FCFB tape IRQs
BNE TPEOI ;$FC92
WRLDR2
LDA #$78
JSR TONE1 ;$FBF3
BNE TPEOI ;$FC92
DEC INBIT
BNE TPEOI ;$FC92
JSR NCHAR
DEC RIPRTY
BPL TPEOI ;$FC92
LDX #$0A
JSR STOIRQ1 ;$FCFB
CLI
INC RIPRTY
LDA FSBLK
BEQ STOIRQ ;$FCF6
JSR RSTTPP
LDX #$09
STX CNTDN
BNE TWRD3A ;$FC54
;
; RESIRQ - Restore normal IRQ
;
RESIRQ
PHP
SEI
JSR NOMOTR
LDA #%01111111 ;$7F
STA D2IER
LDA #%11110111 ;$F7
STA D2ORB
LDA #%01000000 ;$40
STA D2ACR
JSR ENABTM
LDA TAPIRQ+1
BEQ RSIRQEX ;$FCF4
STA IRQVP+1
LDA TAPIRQ
STA IRQVP
RSIRQEX
PLP
RTS
;====================================================================
; STOIRQ - Set IRQ vector
;
STOIRQ
JSR RESIRQ
BEQ TPEOI ;$FC92
STOIRQ1
LDA RATS3,X ;$FDE9,X ;TPVECS
STA IRQVP
LDA RATS3+1,X ;$FDEA,X
STA IRQVP+1
RTS
;====================================================================
; NOMOTR - Kill tape motor
;
NOMOTR
LDA D1PCR
ORA #%00001110 ;$0E
STA D1PCR
RTS
;====================================================================
; CKWRPT - Check read/write pointer
;
CKWRPT
SEC
LDA SAL
SBC EAL
LDA SAL+1
SBC EAL+1
RTS
;====================================================================
; INCRDP - Bump read/write pointer
;
INCRDP
INC SAL
BNE INCRSK ;$FD21
INC SAL+1
INCRSK
RTS
;####################################################################
; Power-on RESET entry
;####################################################################
RESET
LDX #$FF
SEI
TXS
CLD
JSR SCNROM
BNE SKIPA0 ;$FD2F
JMP (A0BASE)
SKIPA0
JSR RAMTAS
JSR IRESTR
JSR IOINIT
JSR CINT1
CLI
JMP (BENTER)
;====================================================================
; SCNROM - Scan ROM areas for Autostart ROM signature
;
SCNROM
LDX #$05
SCNLOOP
LDA SCANEX,X ;$FD4C,X
CMP A0BASE+3,X ;$A003,X
BNE SCANEX ;$FD4C
DEX
BNE SCNLOOP ;$FD41
SCANEX
RTS
;
; ROMSIG - Autostart ROM signature
;
ROMSIG
.db "A0", $C3, $C2, $CD ;A0CBM
;====================================================================
; IRESTR - Restore KERNEL vectors (internal)
;
IRESTR
LDX #$EA ;FIXUP2;#$6D
LDY #$EA ;FIXUP2+1;#$FD $FD6D KERNEL vecs
CLC
;
; IVECTR - Change vectors for user
;
IVECTR
STX MEMUSS
STY MEMUSS+1
LDY #$1F
VECLOOP
LDA IRQVP,Y
BCS VECSK ;$FD64
LDA (MEMUSS),Y
VECSK
STA (MEMUSS),Y
STA IRQVP,Y
DEY
BPL VECLOOP ;$FD5D
RTS
;
;KERNEL Vectors
;
KNRLSV
;FD6D
;FD75
;FD7D
;FD85
.dw IRQVEC, WARMST, LNKNMI, IOPEN
.dw ICLOSE, ICHKIN, ICHKOT, ICLRCH
.dw ICHRIN, ICHROT, ISTOP, IGETIN
.dw ICLALL, WARMST, LNKLOD, LNKSAV
;====================================================================
; RAMTAS - Initialize system contents
;
RAMTAS
LDA #$00
TAX
RAMTSLP1
STA USRPOK,X
STA BUF,X
STA ERRVPT,X
INX
BNE RAMTSLP1 ;$FD90
LDX #$3C ;setup cassette buffer
LDY #$03
STX TAPE1
STY TAPE1+1
STA STAL
STA REGSAV
STA OSSTAR
TAY
LDA #$04
STA STAL+1
RAMTASLP2
INC STAL
BNE RAMTAS1 ;$FDB5
INC STAL+1
RAMTAS1
JSR MEMTST
LDA REGSAV
BEQ RAMTAS3 ;$FDDE
BCS RAMTASLP2 ;$FDAF
LDY STAL+1
LDX STAL
CPY #$20
BCC I6561LP ;$FDEB
CPY #$21
BCS RAMTAS2 ;$FDD2
LDY #$1E
STY HIPAGE
RAMTAS1A
JMP STOTOP ;$FE7B
RAMTAS2
LDA #$12
STA OSSTAR+1
LDA #$10
STA HIPAGE
BNE RAMTAS1A ;$FDCF
RAMTAS3
BCC RAMTASLP2 ;$FDAF
LDA STAL+1
STA OSSTAR+1
STA REGSAV
CMP #$11
RATS3
BCC RAMTASLP2 ;$FDAF
I6561LP
JSR V6561I-2 ;$E5C3
JMP I6561LP ;$FDEB
;====================================================================
; TAPEVC - Tape IRQ vectors
;
TAPEVC
; .dw $FCA8, $FC0B, $EABF, $F98E
.dw WRLDR2, TWRD7, IRQVEC, RDTPBT
;====================================================================
; IOINIT - Initialize I/O
;
IOINIT
LDA #%01111111 ;$7F
STA D1IER
STA D2IER
LDA #%01000000 ;$40
STA D2ACR
LDA #%01000000 ;$40
STA D1ACR
LDA #%11111110 ;$FE
STA D1PCR
LDA #%11011110 ;$DE
STA D2PCR
LDX #$00
STX D1DDRB
LDX #%11111111 ;$FF
STX D2DDRB
LDX #$00
STX D2DDRA
LDX #%10000000 ;$80
STX D1DDRA
LDX #$00
STX D1ORAH
JSR SCLK1
LDA #%10000010 ;$82
STA D1IER
JSR SCLK0
;
; ENABTM - Enable timer
;
ENABTM
LDA #%11000000 ;$C0
STA D2IER
LDA #%10001001 ;$89
STA D2TM1L
LDA #%01000010 ;$42
STA D2TM1L+1
RTS
;====================================================================
; ISETNM - Set filename (internal)
;
ISETNM
STA FNMLEN
STX FNPTR
STY FNPTR+1
RTS
;====================================================================
; ISETLF - Set logical file parameters (internal)
;
ISETLF
STA LOGFIL
STX CHANNL
STY SECADR
RTS
;====================================================================
; IRDST - Get I/O status word (internal)
;
IRDST
LDA CHANNL
CMP #$02
BNE ISETMS+2 ;$FE68
LDA RSSTAT
LDA #$00
STA RSSTAT
RTS
;====================================================================
; ISETMS - Control OS messages (internal)
;
ISETMS
STA CMDMOD
LDA CSTAT
ISETMS1
ORA CSTAT
STA CSTAT
RTS
;====================================================================
; ISETTO - Set IEEE timeout (internal)
;
ISETTO
STA STIMOT
RTS
;====================================================================
; IMEMTP - Set/read top of memory (internal)
;
IMEMTP
BCC STOTOP ;$FE7B
LDX OSTOP
LDY OSTOP+1
STOTOP
STX OSTOP
STY OSTOP+1
RTS
;====================================================================
; IMEMBT - Set/read bottom of memory (internal)
;
IMEMBT
BCC STOBOT ;$FE8A
LDX OSSTAR
LDY OSSTAR+1
STOBOT
STX OSSTAR
STY OSSTAR+1
RTS
;====================================================================
; MEMTST - Test memory
;
MEMTST
LDA (STAL),Y
TAX
LDA #%01010101 ;$55
STA (STAL),Y
CMP (STAL),Y
BNE MEMTS1 ;$FEA4
ROR A
STA (STAL),Y
CMP (STAL),Y
BNE MEMTS1 ;$FEA4
.db $A9 ;LDA #$18
MEMTS1
CLC
TXA
STA (STAL), Y
RTS
;====================================================================
; NMI - NMI transfer entry
;====================================================================
NMI
SEI
JMP (NMIVP) ;$FEAD
;====================================================================
; LNKNMI - Link to NMI code
;
LNKNMI
PHA
TXA
PHA
TYA
PHA
LDA D1IFR
BPL WARMEOI ;$FEFF EOI
AND D1IER
TAX
AND #%00000010 ;$02
BEQ WARM1 ;$FEDE
JSR SCNROM
BNE LNKNMI1 ;$FEC7 skip A0 init
JMP (A0BASE+2)
LNKNMI1
BIT D1ORA
JSR IUDTIM
JSR STOP
BNE WARMEOI ;$FEFF EOI
;====================================================================
; WARMST - Default USER vector
;
WARMST
JSR IRESTR
JSR IOINIT
JSR CINT1
JMP (BENTER+2)
WARM1
LDA D1IER
ORA #%10000000 ;$80
PHA
LDA #%01111111 ;$7F
STA D1IER
TXA
AND #%01000000 ;$40
BEQ WARM2 ;$FF02
LDA #%11001110 ;$CE
ORA NXTBIT
STA D1PCR
LDA D1TM1L
PLA
STA D1IER
JSR SSEND
WARMEOI
JMP EOI
WARM2
TXA ;serial NMI
AND #%00100000 ;$20
BEQ WARM3 ;$FF2C
LDA D1ORB
AND #%00000001 ;$01
STA INBIT
LDA D1TM2L
SBC #$16
ADC BAUDOF
STA D1TM2L
LDA D1TM2L+1
ADC BAUDOF+1
STA D1TM2L+1
PLA
STA D1IER
JSR SERRX
JMP EOI
WARM3
TXA
AND #%00010000 ;$10
BEQ EOI
LDA M51CTR
AND #%00001111 ;$0F
BNE $+2 ;$FF38
ASL A
TAX
LDA R232TB-2,X ;$FF5A,X
STA D1TM2L
LDA R232TB-1,X ;$FF5B,X
STA D1TM2L+1
LDA D1ORB
PLA
ORA #%00100000 ;$20
AND #%11101111 ;$EF
STA D1IER
LDX BITNUM
STX BITCI
;
; EOI - End of Interrupt external entry point
;
EOI
PLA
TAY
PLA
TAX
PLA
RTI
;====================================================================
; 232TBL - Baud rate tables
;
R232TB
.db $92, $27, $40, $1A, $C6, $11, $74, $0E
.db $EE, $0C, $45, $06, $F1, $02, $46, $01
.db $B8, $00, $71, $00, $2A, $00
;====================================================================
; IRQ - IRQ transfer point
;====================================================================
IRQ
PHA
TXA
PHA
TYA
PHA
TSX
LDA FBUFFR+4,X ;$0104,X
AND #%00010000 ;$10 breakpoint or IRQ
BEQ BRKSKIP ;$FF82
JMP (BRKVP)
BRKSKIP
JMP (IRQVP)
;====================================================================
; - Vector table
;
;$ff85
.dw $FFFF ;unused
.dw $FFFF ;unused
.db $FF
JMP IRESTR ;$FD52 RESTOR
JMP IVECTR ;$FD57 VECTOR
JMP ISETMS ;$FE66 SETMSG
JMP ISECND ;$EEC0 SECND
JMP ITKSA ;$EECE
JMP IMEMTP ;$FE73
JMP IMEMBT ;$FE82
JMP ISCNKY ;$EB1E
JMP ISETTO ;$FE6F SETTMO
JMP IACPTR ;$EF19 ACPTR
JMP ICIOUT ;$EEE4
JMP IUNTLK ;$EEF6
JMP IUNLSN ;$EF04
JMP ILISTN+1 ;$EE16
JMP ITALK ;$EE14
JMP IRDST ;$FE57 READST
JMP ISETLF ;$FE50 SETLFS
JMP ISETNM ;$FE49
JMP (OPENVP) ;$F40A OPEN
JMP (CLOSVP) ;$F34A CLOSE
JMP (CKINVP) ;$F2C7 CHKIN
JMP (CKOTVP) ;$F309 CHKOUT
JMP (CLCHVP) ;$F3F3 CLRCH
JMP (CHINVP) ;$F20E CHRIN
JMP (CHOTVP) ;$F27A CHROUT
JMP ILOAD ;$F542
JMP ISAVE ;$F675
JMP ISETTM ;$F767 SETTIM
JMP IRDTIM ;$F760
JMP (STOPVP) ;$F770 STOP
JMP (GTINVP) ;$F1F5 GETIN
JMP (CLALVP) ;$F3EF CLALL
JMP IUDTIM ;$F734
JMP ISCREN ;$E505
JMP IPLOT ;$E50A
JMP IIOBASE ;$E500
.dw $FFFF ;unused
.dw $FFFF ;unused
;====================================================================
; - Power-on Vectors
;
.dw NMI ;$FEA9
.dw RESET ;$FD22
.dw IRQ ;$FF72
.end